如何在Delphi中使用SuperObject库创建JSON文件?

10

我正在使用Delphi 2010和superobject库。

我已经了解了如何解析JSON文件,但是我不知道如何创建JSON?

算法如下:

  1. 解析JSON并加载到TStringGrid中
  2. 添加数据
  3. 将所有TStringGrid数据保存为JSON。

需要一些示例。

谢谢。


那么,您不知道如何将数据保存为JSON字符串或将Delphi字符串保存到文件中吗? - Arioch 'The
我不知道如何将数据保存到JSON中。 - Romowski
尝试将您的数据转储到“变量数组”中,然后使用SA helper创建数组。详见:http://superobject.googlecode.com/git/readme.html - Arioch 'The
我已经阅读了这个。但我想知道如何保存像你给我的教程中的初始JSON那样的复杂结构。 - Romowski
请查看源代码(或调试器)以了解 obj := ctx.AsJson<TData>(data); 的实际实现。 - Arioch 'The
2
请查看演示 http://code.google.com/p/superobject/source/browse/tests/test_usage.dpr - Arioch 'The
4个回答

26

示例代码将以下结构添加到JSON对象中,然后保存到文件:

(*
{
  "name": "Henri Gourvest", /* this is a comment */
  "vip": true,
  "telephones": ["000000000", "111111111111"],
  "age": 33,
  "size": 1.83,
  "addresses": [
    {
      "address": "blabla",
      "city": "Metz",
      "pc": 57000
    },
    {
      "address": "blabla",
      "city": "Nantes",
      "pc": 44000
    }
  ]
}
*)

procedure SaveJson;
var
  json, json_sub: ISuperObject;
begin
  json := SO;

  json.S['name'] := 'Henri Gourvest';
  json.B['vip'] := TRUE;
  json.O['telephones'] := SA([]);
  json.A['telephones'].S[0] := '000000000';
  json.A['telephones'].S[1] := '111111111111';
  json.I['age'] := 33;
  json.D['size'] := 1.83;

  json.O['addresses'] := SA([]);

  json_sub := SO;
  json_sub.S['address'] := 'blabla';
  json_sub.S['city'] := 'Metz';
  json_sub.I['pc'] := 57000;
  json.A['addresses'].Add(json_sub);

  json_sub.S['address'] := 'blabla';
  json_sub.S['city'] := 'Nantes';
  json_sub.I['pc'] := 44000;
  json.A['addresses'].Add(json_sub);

  json.SaveTo('C:\json_out.txt');

  json := nil;
  json_sub := nil;
end;

2
或许可以将 json.A['telephones'].S[0] := '000000000'; 改为 json['telephones[0]'] := '000000000';,将 json.A['addresses'].Add(json_sub); 改为 json['addresses[]'] := json_sub; - Arioch 'The
请问您能添加一些示例代码来展示如何添加一个具有名称的对象数组吗?例如,在地址下面,您可能会有一个楼宇对象,该对象具有一个地址属性。 - none

8

阅读帮助文件:https://github.com/hgourvest/superobject/blob/master/README.md

然后阅读TSuperArray的源代码(“使用源代码,卢克”)

得到以下代码段:

var
  obj: ISuperObject;
  a:   TSuperArray; // shortcut
begin
  obj := TSuperObject.Create(stArray);
  // or obj := SA([]);

  a := obj.AsArray;

  a.s[0] := 'aaaa';
  a.s[1] := 'bbbb';
  a.s[3] := 'cccc';

  ...

  obj.SaveTo('File.txt');
  a := nil; obj := nil;

  ...
end;

帮助文件中还有这样一句引用:obj['foo[]'] := value; // 添加一个数组项
这提供了另一种方法来填充数组(如果根对象本身不是数组)。引用http://code.google.com/p/superobject/source/browse/tests/test_usage.dpr

my_array := TSuperObject.Create(stArray);
    my_array.I[''] := 1; // append
    my_array.I[''] := 2; // append
    my_array.I[''] := 3; // append
    my_array.I['4'] := 5;

接下来,这个对象数组将作为属性插入到另一个对象中。

    my_object := TSuperObject.Create(stObject);
    my_object.I['abc'] := 12;
   // my_object.S['path.to.foo[5]'] := 'bar';
    my_object.B['bool0'] := false;
    my_object.B['bool1'] := true;
    my_object.S['baz'] := 'bang';
    my_object.S['baz'] := 'fark';
    my_object.AsObject.Delete('baz');
    my_object['arr'] := my_array;

0

TObjectList示例

type
  TPeople = class
    ID: Integer;
    Name: string;
    Address: string;
    function JSON: ISuperObject;
  end;

  TMyClass = class
    TList: TObjectList<TPeople>;
    procedure SaveToJSON(var JSON: ISuperObject);
  end;


function TPeople.JSON: ISuperObject;
begin
  Result := SO;  //defining a JSON Object
  Result.I['id'] := ID;
  Result.S['name'] := Name;
  Result.S['address'] := Address;
end;

procedure TMyClass.SaveToJSON(var JSON: ISuperObject);
var
  Obj: TDLSBatchField;
begin
  JSON := SO;
  JSON.I['count'] := FItems.Count;
  JSON['items'] := SA([]);  //defining an array
  for Obj in FItems do
    JSON.A['items'].Add(Obj.JSON);
end;

-1
一个非常好的库是 LkJson:http://sourceforge.net/projects/lkjson/

解析:

var jsText : String; jsObj : TlkJSONobject; begin

jsObj:=TlkJSON.ParseText(jsText) as TlkJSONobject;

将其转换回文本:

jsText := TlkJSON.GenerateText(jsObj);

OP特别是已经在使用一个叫做SuperObject的库,这个回答与此无关。 - Jan Doggen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接