2017-03-23 1 views
1

Ich möchte alle Benutzer von diesem JSON erhalten.Zugriff auf verschachtelte Werte in JSON mit X-SuperObject

{ 
    "status": "ok", 
    "next_max_id": "AQAmA1l9NAQXa", 
    "sections": [ 
    { 
     "module": null, 
     "show_view_all": null, 
     "title": null, 
     "users": [ 
     { 
      "pk": 48165888, 
      "is_verified": false, 
      "profile_pic_url": "http://scontent-sit4-1.cdninstagram.com/t51.2885-19/s150x150/17332306_1915592632007479a.jpg", 
      "full_name": "Jason Giovany Castro Morales", 
      "is_private": false, 
      "has_anonymous_profile_picture": false, 
      "username": "jasongiovanycastromorales", 
      "profile_pic_id": "14699765111792881_48165888" 
     } 
     ] 
    } 
    ] 
} 

Nun, mein Versuch, alle Benutzernamen zu bekommen.

procedure TForm2.Button6Click(Sender: TObject); 
var 
    json : ISuperObject; 
    node : ISuperObject; 
    item : IMember; 
begin 
    try 
    json := TSuperObject.Create(list.Text); 

    for item in json['sections.users'].AsArray do 
    begin 
     node := item.AsObject; 
     Memo4.Lines.Add(node.S['username']); 
    end; 
    finally 
    end; 
end; 

2. Versuch .. ich bekomme ein AV!

var 
    json   : ISuperObject; 
    node   : ISuperObject; 
    item, item2   : IMember; 
    begin 
    json := SO(list.Text); 

    for item in json['sections'].AsArray do 
    begin 
     for item2 in json['users'].AsArray do 
     begin 
     node := item.AsObject; 

     Memo1.Lines.Add(node.S['username']); 
     end; 
    end; 
    end; 

gibt es 200 Benutzername Wert in diesem JSON ich nichts, manchmal AV, wenn ich versuche withthe json Code zu spielen, um, meine Frage ist, wie diese json korrekt analysieren username den Wert zu erhalten? Danke.

Antwort

1

Zunächst würde ich vorschlagen, ihre Website zu besuchen, wo Sie Beispiele und Demos finden können, um zu verstehen, wie man mit SO arbeitet.

Weiter ist Ihr Beispiel kaputt und Sie haben nicht das Format der Eingabedaten angegeben, wie ich nicht weiß, ob alle Objekte in sections Array users Array enthält. Wie auch immer, dieses Beispiel sollte für Ihr Snippet funktionieren.

SuperObject

procedure TForm2.Button6Click(Sender: TObject); 
var 
    json, user, section : ISuperObject; 
begin 
    json := SO(list.Text); 
    for section in json['sections'] do 
    begin 
    if Assigned(section['users']) then 
    begin 
     for user in section['users'] do 
     begin 
     if user.S['username'] <> '' then 
      Memo4.Lines.Add(user.S['username']); 
     end; 
    end; 
    end; 
end; 

EDIT: In der Tat, Sie sind SuperObject nicht verwenden, aber X-SuperObject, was etwas anderes ist. Obwohl ich diese Bibliothek noch nie benutzt habe, konnte ich das Problem nur mit Beispielen von ihrer Website finden, weil Sie einfache Fehler machen, wie item anstelle von item2 oder json und item in der zweiten Schleife zu verwenden.

X-SuperObject

procedure TForm2.Button6Click(Sender: TObject); 
var 
    json : ISuperObject; 
    item, item2 : IMember; 
begin 
    json := TSuperObject.Create(list.Text); 
    for item in json['sections'].AsArray do 
    begin 
    for item2 in item.AsObject['users'].AsArray do 
     Memo1.Lines.Add(item2.AsObject['username'].ToString); 
    end; 
end; 
+0

Fehler 'or-in-Anweisung kann nicht auf Sammlungstyp 'ISuperExpression' arbeiten, weil 'ISuperExpression' kein Mitglied für 'GetEnumerator' enthält, oder es ist nicht zugänglich ' –

+0

Bearbeitete meine Antwort. Sie sollten den Variablen, die Sie verwenden, mehr Aufmerksamkeit schenken und die Frage klar spezifizieren. – Triber

+0

Mein Bad, ich dachte, X-SuperObject ist nur ein Upgrade auf SuperObject, viele Dank bro –

0

HAFTUNGSAUSSCHLUSS: diese Antwort auf SuperObject bezieht. Zu der Zeit wurde diese Antwort gegeben, es war unbekannt, dass sich die Frage tatsächlich auf XSuperObject bezieht.


ich nichts

Dies ist unwahrscheinlich, da sollten Sie zumindest eine Zugriffsverletzung erhalten. Dies liegt daran, dass Sie das Superobjekt nicht auf die richtige Weise erstellen.

Ich empfehle Ihnen, die Factory-Funktion SO() zu verwenden, anstatt den Konstruktor TSuperObject.Create aufzurufen.

Dann müssen Sie daran denken, dass sowohl sections als auch users Arrays sind. So müssen Sie beiden Arrays in einer verschachtelten Iteration iterieren:

var 
    json: ISuperObject; 
    section: ISuperObject; 
    user: ISuperObject; 
begin 
    json := SO(list.Text); 
    for section in json['sections'] do // iterate sections 
    for user in section['users'] do // iterate users 
     Memo4.Lines.Add(user.S['username']); 
end; 

Hinweis: Dieses Beispiel ein minimaler Ansatz. Sie sollten weitere Prüfungen hinzufügen (z. B. Assigned()), um Ausnahmen zu verhindern.

+0

'for-in-Anweisung kann nicht auf Sammlungstyp 'ISuperExpression' arbeiten, weil 'ISuperExpression' kein Mitglied für 'GetEnumerator' enthält, oder es ist unzugänglich. Deshalb habe ich 'IMember' verwendet. –

+0

Ich hätte meine Antwort nicht gepostet, ohne sie vorher kompiliert und getestet zu haben. Ich habe keinen solchen Fehler. Woher kommt 'ISuperExpression'? Mein Code iteriert ausschließlich über den ISUperObject-Enumerator, der 'ISuperObject' zurückgibt. –

+0

Genau in dieser Zeile 'für den Abschnitt in json ['sections'] tun // Abschnitte ' –

Verwandte Themen