写一个json文本

时间:2015-10-06 11:34:09

标签: json delphi delphi-7

我在delphi 7中使用lkJSON-1.07,在他们的例子中

js := TlkJSONobject.Create;
js.Add('namestring','namevalue');
// get the text of object
s := TlkJSON.GenerateText(js);
  writeln(s);
writeln;
writeln('more readable variant:');
// (ver 1.03+) generate readable text
i := 0;
s := GenerateReadableText(js,i);
writeln(s);

js.Free;

它会生成如下文本: {   " namestring":" namevalue" }

如何编写像这样的json文本格式:

{
  "Users": 
  {
    "test_user1":
    {
        "time":1600,
        "Points":4
    }
    "test_user2":
    {
        "time":1500,
        "Points":3
    }
  }
}

1 个答案:

答案 0 :(得分:3)

在使用JSON Delphi Library时,您必须采用以下方法才能将子JSON元素添加到其父级:

function TlkJSONobject.Add(const aname: WideString; aobj: TlkJSONbase): Integer;

该方法允许aobj参数作为aname元素的子项附加。

以下代码可以完成您的任务:

var
  js0, js1, js2, js22: TlkJSONobject;
  s: string;
  i: Integer;
begin
  js2 := TlkJSONobject.Create;
  js2.Add('time', '1600');
  js2.Add('Points', 4);

  js22 := TlkJSONobject.Create;
  js22.Add('time', '1500');
  js22.Add('Points', 3);

  js1 := TlkJSONobject.Create;
  js1.Add('test_user1', js2);          
  js1.Add('test_user2', js22);

  js0 := TlkJSONobject.Create;
  js0.Add('Users', js1);

  i := 0;
  s := GenerateReadableText(js0, i);
  WriteLn(s);

  js0.Free;
end;

这是编写前面代码的更合适的方法 - 但在我看来可读性较差。

这里的想法是以自然的父子关系顺序创建元素:使用Field对象的TlkJSONobject属性将子元素添加到已插入的父元素中。

请注意js.Field['some string']js['some string']相同,因为default指令已应用于Field属性。

var
  js: TlkJSONobject;
  s: string;
  i: Integer;
begin
  js := TlkJSONobject.Create;
  try
    js.Add('Users', TlkJSONobject.Create);

    with TlkJSONobject(js['Users']) do begin
      Add('test_user1', TlkJSONobject.Create);
      Add('test_user2', TlkJSONobject.Create);
    end;

    with TlkJSONobject(TlkJSONobject(js['Users'])['test_user1']) do begin
      Add('time', '1600');
      Add('Points', 4);
    end;

    with TlkJSONobject(TlkJSONobject(js['Users'])['test_user2']) do begin
      Add('time', '1500');
      Add('Points', 3);
    end;

    i := 0;
    s := GenerateReadableText(js, i);
    WriteLn(s);

  finally
    js.Free;
  end;
end;

运行项目,打印:

{
     "Users":{
         "test_user1":{
             "time":"1600",
             "Points":4
         },
         "test_user2":{
             "time":"1500",
             "Points":3
         }
     }
}

在一个实际案例中,你显然会考虑创建对象并使用一些循环指令附加子对象。