写 json 篇文字

Write a json text

我在 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
    }
  }
}

在使用 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;

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

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

请注意 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
         }
     }
}

在实际情况下,您显然会考虑创建对象并使用一些循环指令追加子项。