【问题标题】:Can't deserialize valid JSON using system.json无法使用 system.json 反序列化有效的 JSON
【发布时间】:2016-04-14 20:21:39
【问题描述】:

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

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

desearilizing JSON using SuperObject

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

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

我正在使用 Delphi XE7 System.JSON,不想使用超级对象或任何其他库。

如何作为数组使用?

我粘贴生成 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"]
        ]
    }]
}

【问题讨论】:

  • 不清楚你在这里问什么。您似乎在说您在使用此代码生成的 JSON 时遇到问题,并且它生成的 JSON 被 PHP 正确使用,这表明生产者代码本身没有任何问题。您确实需要发布您的 consumer 代码,并更清楚地解释它如何以及为什么不适合您。
  • json选择的结构很奇怪。
  • 我同意 Rufo 爵士的观点 - 选择的结构非常奇怪,并且在最低级别缺少 JSON 对会导致问题。
  • 您发布的 JSON 被 SuperObject 解析,就像一个魅力。请参阅rghost.ru/7vCtds8jY.view 所以 Deltics 是绝对正确的 - 您的 Delphi 消费者代码有问题,如果您希望我们能够找到其中的错误,您必须发布消费者代码

标签: json delphi delphi-xe7


【解决方案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 );

找回你的对象。

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

【讨论】:

  • ...然后更改格式会破坏他的 PHP 使用者...嗯,他选择创建两个数组而不是元组数组,虽然这很奢侈,但它仍然是正确的。给定正确的消费者代码和库,可以使用他的代码。比我记得 DBX-JSON(我怀疑它不是 System.JSON 的重命名)有很多错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多