无法使用system.json反序列化有效的JSON

时间:2016-04-14 20:21:39

标签: json delphi delphi-xe7

我编写了一些代码(rest服务器),为我生成JSON格式的数据。当我在PHP中使用它时工作正常,JSON有效,一切正常。当我在Delphi中使用它时,没有任何作用。

当我搜索互联网时,我发现:

desearilizing JSON using SuperObject

但该方法为我返回空字符串。

我想将JSON元素用作数组(例如JSONValue.items [i])。

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

如何将其用作数组?

我粘贴生成JSON的代码:

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

这就是结果:

{{1}}

1 个答案:

答案 0 :(得分: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 );

让你的物体回来。

如果您想要使用此方法的更完整的示例,请告诉我,我将发布。