json object doorlopen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 13-07 16:24

Saven

Administrator

Topicstarter
Hola,
Via een een AJAX request wil ik een winkelmandje live updaten. Hiervoor maak ik serverside een array en zet ik die om naar JSON (via json_encode()). Mijn AJAX script haalt de gegevens ook als JSON op.

Ik krijg in principe het volgende terug na de AJAX request:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "product_count": 3,
  
  "total_price": 1700,
  
  "cart_recent":
  {
    "77de68daecd823babbb58edb1c8e14d7106e83bb":
    {
      "id": "3",
      "name": "Product Y",
      "price": "170",
      "qty": 1
    },
    "da4b9237bacccdf19c0760cab7aec4a8359010b0":
    {
      "id": "2",
      "name": "Product Z",
      "price": "330",
      "qty": 1
    }
  }
}


En ik gebruik de volgende code voor mijn AJAX request en het afhandelen daarvan:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function parse_cart_update(data)
{
    //-----------------------------------------
    // Nutteloos iknow
    //-----------------------------------------
    var obj = data;
    
    //-----------------------------------------
    // Kijken of het 1 product is of xx producten
    //-----------------------------------------
    var product_count_str = '';
    
    if( obj.product_count == 1 )
    {
        product_count_str = '1 product';
    }
    else
    {
        product_count_str = obj.product_count + ' producten';
    }
    
    //-----------------------------------------
    // Html velden updaten
    //-----------------------------------------
    $("#cart_product_count").html(product_count_str);
    $("#cart_total_price").html(obj.total_price);
    
    //-----------------------------------------
    // Geeft undefined
    //-----------------------------------------
    alert(obj.cart_recent.length);
    
    //-----------------------------------------
    // Nu wil ik de recente artikelen plaatsen
    //-----------------------------------------
    for( var i=0; i < obj.cart_recent.length; i++ )
    {
        //alert(obj.cart_recent[i]);
        $("#cart-recent").append('<p>' + obj.cart_recent[i].name + '</p>');
    }
}


Als ik de lengte van dat object wil opvragen dan krijg ik een undefined melding terug. Na wat research ben ik erachter gekomen dat dat komt omdat een object niet hetzelfde werkt als een array.

Maar hoe kan ik dit oplossen? Heb altijd geleerd dat in dit soort gevallen een JSON object terugsturen de beste methode is, maar hoe kan ik dit nu in hemelsnaam verwerken als ik het object niet kan doorlopen?

[ Voor 18% gewijzigd door Saven op 01-04-2013 14:55 ]


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Wil je volgende keer even alleen relevante code posten ;)

Maarre je kan elementen benaderen als je ze "kent" middels
JavaScript:
1
2
json["DSC21"]["Router"]["online"][0];    // 1
json.DSC21.Router.online[0];    // equivalent


en anders gewoon met een simpele for erdoorheen
JavaScript:
1
2
3
4
for (var key in json) {
    console.log(key);   // _id, DSC21, DCS22 etc..
    console.log(json[key]);    // { "$oid": "" }, { "Router": ".." } etc.
}


Wil je een lengte tellen, dan kan je tijdens het traversen een tellertje bijhouden (mits obj.hasOwnProperty(key) ;))

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!

  • Saven
  • Registratie: December 2006
  • Laatst online: 13-07 16:24

Saven

Administrator

Topicstarter
Heb het even opgeschoond :) Bedankt in ieder geval, dit lijkt inderdaad te werken (met een for er doorheen) :)

Acties:
  • 0 Henk 'm!

Anoniem: 2935

Omdat ik zie dat je jQuery lijkt te gebruiken wil ik nog even toevoegen dat dit ook met $.each() kan:

JavaScript:
1
2
3
$.each(json, function(key, value) {
    // doe je ding
});

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 13-07 16:24

Saven

Administrator

Topicstarter
Anoniem: 2935 schreef op maandag 01 april 2013 @ 23:43:
Omdat ik zie dat je jQuery lijkt te gebruiken wil ik nog even toevoegen dat dit ook met $.each() kan:

JavaScript:
1
2
3
$.each(json, function(key, value) {
    // doe je ding
});
thnx, niet aan gedacht :)

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Anoniem: 2935 schreef op maandag 01 april 2013 @ 23:43:
Omdat ik zie dat je jQuery lijkt te gebruiken wil ik nog even toevoegen dat dit ook met $.each() kan:

JavaScript:
1
2
3
$.each(json, function(key, value) {
    // doe je ding
});
Goeie aanvulling d:)b

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!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 18-03 09:33

_Thanatos_

Ja, en kaal

Lijkt me onverstandig. Je weet als javascripter niet zeker wat de server allemaal in je json plempt, dus je moet wel wat flinke controles uitvoeren op de values. Zeker nooit een kale for..in (of jQuery equivalent) gebruiken.

In dit geval is het óf een kwestie van de server duidelijk maken dat ie een array als array moet geven (daar zijn ze voor), óf als dat niet kan, een gefilterede for..in loop gebruiken.

[ Voor 30% gewijzigd door _Thanatos_ op 11-04-2013 02:44 ]

日本!🎌


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
_Thanatos_ schreef op donderdag 11 april 2013 @ 02:42:
Lijkt me onverstandig. Je weet als javascripter niet zeker wat de server allemaal in je json plempt, dus je moet wel wat flinke controles uitvoeren op de values. Zeker nooit een kale for..in (of jQuery equivalent) gebruiken.

In dit geval is het óf een kwestie van de server duidelijk maken dat ie een array als array moet geven (daar zijn ze voor), óf als dat niet kan, een gefilterede for..in loop gebruiken.
Ik zie totaal het nut niet van deze suggestie :? Als de server zegt: \[0] vul element met id #foo met 'bar' \[1] zet #woot op rood \[2] vul element #snowman met '<message id="128389">Hello from sun!</message>' hoe boeit dat dan? Als je browser in dat JS lusje braaf uitvoert wat de server zegt is dat toch geen wezenlijk verschil met 't "gewoon" ophalen van een pagina (GET dus, ofwel een "pagina refresh" in de volksmond). Het netto effect is exact hetzelfde. En wat valt daar aan te filteren?

En waarom zou ik de server niet vertrouwen als "javascripter"? Alsof de JS en de HTML in eerste instantie niet ook van dezelfde server vandaan komen? Enkel bij cross-site request zou je enige sanitizing kunnen doen, maar dat is hier helemaal niet aan de orde.

Ik weet niet wat ik van je post moet maken; ik heb 'm 3 keer gelezen en drie keer anders begrepen / geïnterpreteerd :P Als je doelt op 't feit dat je niet weet of de server een array of enkel element (of mogelijk zelfs niets) retourneert: dat is:
[list=a]
• kwestie van consistent zijn, altijd array returnen (\[] voor 0 elementen, \[{"X":0}] voor 1 element en \[{"X":0}, {"Y":1}, ...] voor meer elementen
• wanneer a niet kan om welke reden dan ook: kwestie van de response even "sniffen" of de response null / enkel item / array is (isarray()-achtig iets)

[ Voor 36% gewijzigd door RobIII op 11-04-2013 03:24 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 11-07 12:10

TheNephilim

Wtfuzzle

Ik denk dat hij inderdaad doelt op het checken van de response op fouten of andere dan gewenste input. Zelf heb ik bij Ajax request altijd iets van status en als die OK is ga ik pas wat doen met de data. Het kan best zijn dat je serverside een foutje maakt of de data niet beschikbaar is.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
TheNephilim schreef op donderdag 11 april 2013 @ 09:50:
Zelf heb ik bij Ajax request altijd iets van status en als die OK is ga ik pas wat doen met de data.
Ja, dat is logisch; maar "data niet vertrouwen" zaken moeten "filteren", "flinke controles uitvoeren" enz. vallen voor mij in een compleet andere categorie.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Anoniem: 2935

TheNephilim schreef op donderdag 11 april 2013 @ 09:50:
Zelf heb ik bij Ajax request altijd iets van status en als die OK is ga ik pas wat doen met de data. Het kan best zijn dat je serverside een foutje maakt of de data niet beschikbaar is.
Als je de JSON ophaalt met $.getJSON() of dataType='json' meestuurt met $.ajax() doet jQuery al checks of de JSON valide is, voor zover ik weet.

http://api.jquery.com/jQuery.getJSON/

Acties:
  • 0 Henk 'm!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 18-03 09:33

_Thanatos_

Ja, en kaal

Ik noem dat filteren, omdat je niet zeker kan weten wat er in een object zit. Weet weet gebruik je een plugin die stiekem aan het prototype van Object prutst. Die properties krijg je dan ook in je json-objecten, want die erven ook van het object Object.

日本!🎌


Acties:
  • 0 Henk 'm!

  • Slurpie
  • Registratie: Oktober 2004
  • Laatst online: 14-07 11:41
Anoniem: 2935 schreef op maandag 01 april 2013 @ 23:43:
Omdat ik zie dat je jQuery lijkt te gebruiken wil ik nog even toevoegen dat dit ook met $.each() kan:

JavaScript:
1
2
3
$.each(json, function(key, value) {
    // doe je ding
});
Dit in veel gevallen wel een heel stuk langzamer dan een for.
http://jsperf.com/forloops3/4

Acties:
  • 0 Henk 'm!

  • phex
  • Registratie: Oktober 2002
  • Laatst online: 09-07 13:51
Wat pas merkbaar wordt bij grote data sets.

Acties:
  • 0 Henk 'm!

Anoniem: 2935

Slurpie schreef op vrijdag 12 april 2013 @ 11:48:
Dit in veel gevallen wel een heel stuk langzamer dan een for.
http://jsperf.com/forloops3/4
Performance is overrated.
Pagina: 1