2016-04-14 10 views
0

Ich schreibe einen Code (Rest-Server), die für mich Daten im JSON-Format erzeugen. Wenn ich es in PHP verwende, funktioniert es gut, JSON ist gültig, alles ist in Ordnung. Wenn ich es in Delphi verwende, funktioniert nichts.Kann JSON nicht mit ISO.desktop.json deserialisieren

Wenn ich Internet-Suche fand ich:

desearilizing JSON using SuperObject

aber das Methode gibt leere Strings für mich.

Ich möchte diese JSON-Elemente als Array verwenden (zB JSONValue.items [i]).

Ich benutze Delphi XE7 System.JSON und möchte nicht Superobject oder andere Bibliotheken verwenden.

Wie verwenden Sie es als Array?

ich einfügen meinen Code, JSON erzeugt:

var 
    qry: TfdQuery; 
    FieldsObj: TJSONObject; 
    FieldNameArray: TJSONArray; 
    I: Integer; 
    DataObj: TJSONObject; 
    DataRows: TJSONArray; 
    RowFields: TJSONArray; 
    tablename:string; 
begin 
    tablename:='produkt'; 
    qry := TfdQuery.Create(Self); 
    qry.SQL.Text := 'select * from produkt where (id ='''+ProductID+''')'; 
    qry.Connection := FDConnection1; 
    qry.Open; 
    FieldsObj := TJSONObject.Create; 
    FieldNameArray := TJSONArray.Create; 
    for I := 0 to qry.FieldCount - 1 do 
    FieldNameArray.Add(qry.Fields[I].FieldName); 
    FieldsObj.AddPair(TableName, FieldNameArray); 
    DataObj := TJSONObject.Create; 
    DataRows := TJSONArray.Create; 
    qry.First; 
    while not qry.Eof do 
    begin 
    RowFields := TJSONArray.Create; 
    for I := 0 to qry.FieldCount - 1 do 
     RowFields.Add(qry.Fields[I].AsString); 
    DataRows.Add(RowFields); 
    qry.Next; 
    end; 
    DataObj.AddPair('data', DataRows); 
    Result := TJSONArray.Create(FieldsObj, DataObj); 
    qry.Free; 

Und das ist das Ergebnis:

{ 
    "ProductID": "1", 
    "result": [{ 
     "produkt": ["id", "parent_id", "full_name", "opcja_1", "opcja_2", "opcja_3", "opcja_4", "opcja_5", "opcja_6", "opcja_7", "opcja_8", "opcja_9", "opcja_10", "opcja_11", "opcja_12", "field_address1", "field_address2", "quantity", "opis", "zdjecie1", "zdjecie2", "zdjecie3", "samples", "link_stable0", "link_stable1", "link_stable2", "price1", "price2", "price3"] 
    }, { 
     "data": [ 
      ["1", "1", "name", "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "12", "10", "20", "1,2", "description of product", "http://www.vphosted.com/e6=0", "photo link2", "photo link 3", "sample project file link", "link option", "10", "link", "10", "link", "10"] 
     ] 
    }] 
} 
+3

Es ist nicht klar, was Sie hier fragen. Sie scheinen zu sagen, dass Sie ein Problem damit haben, den JSON zu konsumieren, den dieser Code erzeugt, und dass er JSON erzeugt, der von PHP korrekt konsumiert wird, was darauf hindeutet, dass mit dem Erzeugercode selbst nichts falsch ist. Sie müssen wirklich Ihren * Consumer * -Code veröffentlichen und klarer erklären, wie und warum es nicht für Sie funktioniert. – Deltics

+1

Die gewählte Struktur des JSON ist sehr merkwürdig. –

+0

Ich stimme Sir Rufo zu - die gewählte Struktur ist sehr seltsam und das Fehlen von JSON-Paaren auf der niedrigsten Ebene wird Probleme verursachen. – Dsm

Antwort

1

Dies würde JSON mehr im Format produzieren, was ich erwarten würde:

var 
    qry: TfdQuery; 
    FieldsObj: TJSONObject; 
    //FieldNameArray: TJSONArray; 
    I: Integer; 
    DataObj: TJSONObject; 
    FieldObj: TJSONObject; 
    DataRows: TJSONArray; 
    RowFields: TJSONArray; 
    tablename:string; 
begin 
    tablename:='produkt'; 
    qry := TfdQuery.Create(Self); 
    qry.SQL.Text := 'select * from produkt where (id ='''+ProductID+''')'; 
    qry.Connection := FDConnection1; 
    qry.Open; 
    FieldsObj := TJSONObject.Create; 
    //FieldNameArray := TJSONArray.Create; 
    //for I := 0 to qry.FieldCount - 1 do 
    // FieldNameArray.Add(qry.Fields[I].FieldName); 
    //FieldsObj.AddPair(TableName, FieldNameArray); 
    DataObj := TJSONObject.Create; 
    DataRows := TJSONArray.Create; 
    qry.First; 
    while not qry.Eof do 
    begin 
    RowFields := TJSONArray.Create; 
    for I := 0 to qry.FieldCount - 1 do 
    begin 
     FieldObj := TJSONObject.Create; 
     FieldObject.AddPair(qry.Fields[I].FieldName, qry.Fields[I].AsString)); 
     RowFields.Add(FieldObj); 
    end; 
    DataRows.Add(RowFields); 
    qry.Next; 
    end; 
    DataObj.AddPair('data', DataRows); 
    Result := TJSONArray.Create(FieldsObj, DataObj); 
    qry.Free; 

Wenn Sie die Datensatzstruktur kennen, würde ich jedoch lieber REST.JSON verwenden, die ich Ich bin ziemlich sicher Schiffe mit XE7 und ist viel einfacher zu bedienen. Sie erstellen einfach Ihre Objektstruktur, eine Instanz dieser Struktur erstellen, füllen Sie es mit Ihren Feldwerte und

TJSON.ObjectToJsonString(fObject) 

verwenden, um die Zeichenfolge zu erstellen und

iObject := TJSON.JsonToObject<TMyObject>(pTransferString); 

Ihr Objekt zurück.

Wenn Sie ein vollständigeres Beispiel mit dieser Methode wünschen, lassen Sie es mich wissen und ich werde posten.

+0

.. .und dann würde das Ändern des Formats seinen PHP-Konsumenten zerstören ... Nun, er entschied sich dafür, zwei Arrays anstelle von Tupel zu erstellen, und obwohl das extravagant ist, ist es immer noch korrekt. Sein Code kann mit dem richtigen Consumer-Code und der richtigen lib ausgeführt werden. Als ich mich an DBX-JSON erinnere (von dem ich vermute, dass es nicht in System.JSON umbenannt wurde), hatte es viele Bugs. –