[JS] JSON meerdere objecten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • HaTe
  • Registratie: Mei 2007
  • Laatst online: 16:08

HaTe

haat niet

Topicstarter
Ik ben bezig met een chatsysteem, waarbij ik met ajax elke 2 seconden nieuwe berichten ophaal. Dit gaat goed, totdat er meerdere berichten worden opgehaald met mijn php bestand.

Nu word de string op deze manier geëchoed:
{"door":"13","bericht":"lala","datum":"15:52:40"},
{"door":"18","bericht":"asdf","datum":"15:53:33"},
{"door":"18","bericht":"","datum":"15:53:42"},
{"door":"13","bericht":"jo","datum":"15:59:32"}
Dit kan ik volgensmij niet goed uitlezen met Javascript. Ik zou graag willen weten hoe ik dat dank wel kan doen. Als ik het nu door een eval haal pakt hij alleen het eerste object.

WP: ME PUHZ-SW75YAA + ERST30D-VM2ED | Solar: 17x TSM-340-DE06M.08 (5780Wp ~6200kWh), Azimuth 179°, Hellingshoek: 34° | PC specs


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 09:12

NetForce1

(inspiratie == 0) -> true

maak er een array van door er blokhaken omheen te zetten:
code:
1
2
3
[{door:13, bericht:"lala", datum:"15:52:40"},
...
]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

Verwijderd

NetForce1 schreef op dinsdag 10 maart 2009 @ 19:39:
maak er een array van door er blokhaken omheen te zetten:
code:
1
2
3
[{door:13, bericht:"lala", datum:"15:52:40"},
...
]
Zo is het geen valide JSON. Die heeft namelijk 1 resultaat-object als root. Zoiets dus:
JavaScript:
1
2
3
4
5
6
{"berichten" :[
    {"door":"13","bericht":"lala","datum":"15:52:40"},
    {"door":"18","bericht":"asdf","datum":"15:53:33"},
    {"door":"18","bericht":"","datum":"15:53:42"},
    {"door":"13","bericht":"jo","datum":"15:59:32"}
]}

http://www.json.org/

Acties:
  • 0 Henk 'm!

  • HaTe
  • Registratie: Mei 2007
  • Laatst online: 16:08

HaTe

haat niet

Topicstarter
Oke, het is gelukt :) Thnx

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
var evalvar = http.responseText;
        
        if(evalvar != '') {
            eval(evalvar);
            for(var i in getData.berichten)
            {
                var getBericht = getData.berichten[i].bericht;
                var getDoor = getData.berichten[i].door;
                var getDatum = getData.berichten[i].datum;
                getTotal = getTotal + '<h4 style="margin: 0; padding: 5px 5px 0 5px; font-size: 9pt;}">'+p[getDoor]+' ('+(getDatum)+')</h4><p style="margin: 0; padding: 0 5px;">'+getBericht+'</p>';
            }
            berichtenDiv.innerHTML = berichtenDiv.innerHTML + getTotal;
        }

WP: ME PUHZ-SW75YAA + ERST30D-VM2ED | Solar: 17x TSM-340-DE06M.08 (5780Wp ~6200kWh), Azimuth 179°, Hellingshoek: 34° | PC specs


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:01

TeeDee

CQB 241

Niet dat ik de hele 'eval = evil' discussie wil oprakelen, maar wat zit er in hemelsnaam in je evalvar?
Misschien overtrokken in deze...

[ Voor 16% gewijzigd door TeeDee op 10-03-2009 22:21 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 18:16
Als je weet dat je evalvar van een trusted server komt zou eval() geen probleem hoeven zijn; ik neem aan dat je erin hebt staan:

"getData = {berichten: ...}"

Als alternatief pak je bijvoorbeeld json2.js van www.json.org en maak je ervan:

getData = JSON.parse(evalvar);

Dat JSON altijd een object moet zijn zoals Blues post is trouwens niet correct. Het mag ook een array zijn (RFC 4627 ch2). Zoals NetForce1 aangaf moet dus ook werken.

Naast dat je evalvar geldige JSON moet zijn - als je server een goede JSON encoder gebruikt is dat geen probleem - moet je trouwens nog wel letten op cross-site scripting vulnerabilities. De naam van de auteur en de tekst die ingevoerd is zijn dus zowiezo strings die je moet html escapen. Doe je dit niet serverside dan moet je dit clientside nog doen. Stel bijvoorbeeld dat iemand als bericht typt "<font size=1>hoi</font>".

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Toch even inhakend op 't hele eval = evil stuk hier.

Wellicht handig om naar een JSON parser te kijken (http://www.json.org/js.html onderaan de pagina). Die maakt zichzelf straks obsolete als JSON parsing ondersteunend onderdeel van JS is / wordt. Wellicht gebruik je al een bestaande library en zit daar wellicht ook iets van JSON ondersteuning (zoals bijv. in mootools: http://mootools.net/docs/Utilities/JSON)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:03

crisp

Devver

Pixelated

Verwijderd schreef op dinsdag 10 maart 2009 @ 20:19:
[...]

Zo is het geen valide JSON. Die heeft namelijk 1 resultaat-object als root. Zoiets dus:
[...]
Nee, JSON is een geserialiseerd object of een array (hmmz, was al gezegd :X)
BtM909 schreef op dinsdag 10 maart 2009 @ 22:35:
Toch even inhakend op 't hele eval = evil stuk hier.

Wellicht handig om naar een JSON parser te kijken (http://www.json.org/js.html onderaan de pagina). Die maakt zichzelf straks obsolete als JSON parsing ondersteunend onderdeel van JS is / wordt. Wellicht gebruik je al een bestaande library en zit daar wellicht ook iets van JSON ondersteuning (zoals bijv. in mootools: http://mootools.net/docs/Utilities/JSON)
IE8 biedt al native JSON ondersteuning. Note wel dat JSON officieel UTF8 vereist...

[ Voor 57% gewijzigd door crisp op 10-03-2009 23:10 ]

Intentionally left blank

Pagina: 1