【问题标题】:Delphi XE5 JSON nested objectDelphi XE5 JSON 嵌套对象
【发布时间】:2015-11-10 09:58:44
【问题描述】:

我正在尝试生成 JSON,数据源是 DB FireBird。 我有一个模式来生成这样的路径:

schema:= TDictionary<string, string>.Create;
  schema.Add('DBTableName1', 'nest1.valueKeyName1');
  schema.Add('DBTableName2', 'nest1.valueKeyName2');
  schema.Add('DBTableName3', 'nest2.valueKeyName1');
  schema.Add('DBTableName4', 'nest3.valueKeyName1');
  schema.Add('DBTableName5', 'nest3.valueKeyName2');
  schema.Add('DBTableName6', 'nest4.valueKeyName1');

如何创建函数来生成嵌套对象的路径?

{
    "nest1": {
        valueKeyName1: DBTableValue1,
        valueKeyName2: DBTableValue2,
    },
    "nest2": {
        valueKeyName1: DBTableValue3 
    },
    "nest5":{
        "nest6": {
            "key1": "value1",
            "key2": "value2",
        },
    "nest7": {}
}

在 JavaScript 中,我可以执行以下操作:

if (object.hasOwnProperty['key'] == false) object['key'] = {};
object = object['key'];

但在 Delphi 中我有问题,不知道如何深入:

function TKlient.wprowadzWartoscDoJSON(wartosc: string; JSON: TJSONObject; sciezka: TStringList): TJSONObject;
var
  i: integer;
  obiekt: TJSONObject;
  para: TJSONPair;
  zagniezdzen: integer;

begin
  zagniezdzen := sciezka.Count - 2;
  obiekt := JSON;
  para:= obiekt.Get(sciezka[i]);

  for i := 1 to zagniezdzen do
  begin
    if obiekt.Get(sciezka[i]) = nil then obiekt.AddPair(sciezka[i], TJSONObject.Create)
    else obiekt := obiekt.Get(sciezka[i]);
  end;

  obiekt.AddPair(sciezka[sciezka.Count - 1], wartosc);

  result := obiekt;
end;

【问题讨论】:

    标签: json delphi delphi-xe5


    【解决方案1】:

    这里我使用了TDictionary&lt;string, TJSONObject&gt; 来跟踪对象路径。

    var
      schema: TDictionary<string, string>;
      pathSchema: TDictionary<string{path to every object}, TJSONObject>;
      pair: TPair<string, string>;
      values: TStringDynArray;
      jsonObj,
      jsonChildObj,
      jsonParentObj: TJSONObject;
      path: string;
      i: Integer;
    
    begin
      schema := TDictionary<string, string>.Create;
      try
        schema.Add('DBTableName1', 'nest1.valueKeyName1');
        schema.Add('DBTableName2', 'nest1.valueKeyName2');
        schema.Add('DBTableName3', 'nest2.valueKeyName1');
        schema.Add('DBTableName4', 'nest3.valueKeyName1');
        schema.Add('DBTableName5', 'nest3.valueKeyName2');
        schema.Add('DBTableName6', 'nest4.valueKeyName1');
        schema.Add('value1',       'nest5.nest6.key1');
        schema.Add('value2',       'nest5.nest6.key2');
    
        pathSchema := TDictionary<string, TJSONObject>.Create;
        try
    
          jsonObj := TJSONObject.Create;
          try
            for pair in schema do begin
              values := SplitString(pair.Value, '.');
              path := '';
              jsonParentObj := jsonObj;
              for i := Low(values) to High(values)-1 do begin
                if i > 0 then
                  path := path + '.';
                path := path + values[i];
                if pathSchema.ContainsKey(path) then
                  jsonChildObj := pathSchema[path]
                else begin
                  jsonChildObj := TJSONObject.Create;
                  jsonParentObj.AddPair(TJSONPair.Create(values[i], jsonChildObj));
                  pathSchema.Add(path, jsonChildObj);
                end;
                jsonParentObj := jsonChildObj;
              end;
              jsonChildObj.AddPair(TJSONPair.Create(values[High(values)], pair.Key));
            end;
    
            WriteLn(jsonObj.ToString);
    
          finally
            jsonObj.Free;
          end;
    
        finally
          pathSchema.Free;
        end;
    
      finally
        schema.Free;
      end;
    
      ReadLn;
    
    end.
    

    上面打印出以下内容:

    {
        "nest4":{
            "valueKeyName1":"DBTableName6"
        },
        "nest2":{
            "valueKeyName1":"DBTableName3"
        },
        "nest5":{
            "nest6":{
                "key1":"value1",
                "key2":"value2"
            }
        },
        "nest1":{
            "valueKeyName1":"DBTableName1",
            "valueKeyName2":"DBTableName2"
        },
        "nest3":{
            "valueKeyName1":"DBTableName4",
            "valueKeyName2":"DBTableName5"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 2020-11-15
      • 1970-01-01
      相关资源
      最近更新 更多