2016-04-14 62 views
0

我編寫了一些代碼(其餘服務器),這些代碼以JSON格式爲我生成數據。當我在PHP中使用它時,它工作正常,JSON有效,一切正常。當我在Delphi中使用它時沒有任何效果。無法使用system.json反序列化有效的JSON

當我從網上搜索,我發現:

desearilizing JSON using SuperObject

但是該方法對我來說將返回空字符串。

我想使用該JSON元素作爲數組(例如JSONValue.items [i])。

我正在使用Delphi XE7 System.JSON並且不想使用superobject或任何其他庫。

如何將它用作數組?

我貼我的代碼生成JSON:

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; 

這是結果:

{ 
    "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

目前還不清楚你在這裏問什麼。你似乎在說,你有一個問題需要消費這段代碼產生的JSON,並且它產生了被PHP正確使用的JSON,這意味着生產者代碼本身沒有任何問題。你真的需要發佈你的* consumer *代碼,並更清楚地解釋它是如何以及爲什麼它不適合你。 – Deltics

+1

json的選擇結構很奇怪。 –

+0

我同意Rufo爵士 - 選擇的結構非常奇怪,最低級別缺少JSON對會導致問題。 – Dsm

回答

1

這將更多的格式,我會期望產生JSON:

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; 

但是,如果您知道記錄結構,我寧願使用REST.JSON,而我我非常確定使用XE7並且使用起來更簡單。您只需創建你的對象結構,創建結構的實例,用你的字段值填充它,然後使用

TJSON.ObjectToJsonString(fObject) 

創建您的字符串和

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

讓你的對象了。

如果你想要一個更完整的例子使用這種方法,讓我知道,我會張貼。

+0

..您需要發佈客戶代碼。 。然後改變格式會打破他的PHP消費者...嗯,他選擇製作兩個數組而不是數組元組,而這雖然很奢侈,但它仍然是正確的。他的代碼可以在給定正確的消費者代碼和lib的情況下工作。比我記得DBX-JSON(我懷疑是重命名的不是System.JSON)有很多bug。 –