Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi中用值(而不是对)填充JSON数组?_Json_Delphi_Delphi 10 Seattle - Fatal编程技术网

如何在Delphi中用值(而不是对)填充JSON数组?

如何在Delphi中用值(而不是对)填充JSON数组?,json,delphi,delphi-10-seattle,Json,Delphi,Delphi 10 Seattle,我正在尝试创建如下所示的JSON: { "guestlist": ["alice","bob","charlie"] } var jsobj: TJsonObject; jso : TJsonObject; jsa : TJsonArray; jsp : TJsonPair; begin jsObj := TJsonObject.Create(); jsa := TJsonArray.Create(); jsp := TJSO

我正在尝试创建如下所示的JSON:

{ "guestlist": ["alice","bob","charlie"] }
var 
  jsobj: TJsonObject;      
  jso : TJsonObject;      
  jsa : TJsonArray;
  jsp : TJsonPair;

begin
    jsObj := TJsonObject.Create();
    jsa := TJsonArray.Create();
    jsp := TJSONPair.Create('guestlist', jsa);
    jsObj.AddPair(jsp);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'alice'));
    jsa.AddElement(jso);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'bob'));
    jsa.AddElement(jso);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'charlie'));
    jsa.AddElement(jso);
end;
{ "guestlist": [{"person":"alice"},{"person":"bob"},{"person":"charlie"}] }
JSON(['guestlist',
        VarArrayOf([JSON(['person','alice']),
                    JSON(['person','bob']),
                    JSON(['person','charlie'])
                    ])
    ])
我看到的填充JSON数组的典型示例如下所示:

{ "guestlist": ["alice","bob","charlie"] }
var 
  jsobj: TJsonObject;      
  jso : TJsonObject;      
  jsa : TJsonArray;
  jsp : TJsonPair;

begin
    jsObj := TJsonObject.Create();
    jsa := TJsonArray.Create();
    jsp := TJSONPair.Create('guestlist', jsa);
    jsObj.AddPair(jsp);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'alice'));
    jsa.AddElement(jso);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'bob'));
    jsa.AddElement(jso);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'charlie'));
    jsa.AddElement(jso);
end;
{ "guestlist": [{"person":"alice"},{"person":"bob"},{"person":"charlie"}] }
JSON(['guestlist',
        VarArrayOf([JSON(['person','alice']),
                    JSON(['person','bob']),
                    JSON(['person','charlie'])
                    ])
    ])
但这会导致这样的结果:

{ "guestlist": ["alice","bob","charlie"] }
var 
  jsobj: TJsonObject;      
  jso : TJsonObject;      
  jsa : TJsonArray;
  jsp : TJsonPair;

begin
    jsObj := TJsonObject.Create();
    jsa := TJsonArray.Create();
    jsp := TJSONPair.Create('guestlist', jsa);
    jsObj.AddPair(jsp);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'alice'));
    jsa.AddElement(jso);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'bob'));
    jsa.AddElement(jso);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'charlie'));
    jsa.AddElement(jso);
end;
{ "guestlist": [{"person":"alice"},{"person":"bob"},{"person":"charlie"}] }
JSON(['guestlist',
        VarArrayOf([JSON(['person','alice']),
                    JSON(['person','bob']),
                    JSON(['person','charlie'])
                    ])
    ])

如何向数组中添加单个值而不是一对值?我在
TJsonObject
的文档中没有看到关于如何执行此操作的任何内容,

这实际上比您所说的要简单得多。
TJSONArray
可以很高兴地将任何
TJSONValue
作为元素包含,因此解决方案非常简单

program Project1;
{$APPTYPE CONSOLE}

uses
  JSON;

var
  LJObj : TJSONObject;
  LGuestList : TJSONArray;
begin

  LGuestlist := TJSONArray.Create();
  LGuestList.Add('alice');
  LGuestList.Add('bob');
  LGuestList.Add('charlie');

  LJObj := TJSONObject.Create;
  LJObj.AddPair(TJSONPair.Create('guestlist', LGuestList));

  WriteLn(LJObj.ToString);
  ReadLn;
end.
产生输出:

{“guestlist”:[“alice”、“bob”、“charlie”]}

以防万一,您可能会对另一种选择感兴趣:我创建了它,主要是因为我喜欢COM接口和OLEVANTIONS,并且不喜欢冗长的重载列表。那么上面的代码可能是这样的:

{ "guestlist": ["alice","bob","charlie"] }
var 
  jsobj: TJsonObject;      
  jso : TJsonObject;      
  jsa : TJsonArray;
  jsp : TJsonPair;

begin
    jsObj := TJsonObject.Create();
    jsa := TJsonArray.Create();
    jsp := TJSONPair.Create('guestlist', jsa);
    jsObj.AddPair(jsp);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'alice'));
    jsa.AddElement(jso);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'bob'));
    jsa.AddElement(jso);

    jso := TJsonObject.Create();
    jso.AddPair(TJSONPair.Create('person', 'charlie'));
    jsa.AddElement(jso);
end;
{ "guestlist": [{"person":"alice"},{"person":"bob"},{"person":"charlie"}] }
JSON(['guestlist',
        VarArrayOf([JSON(['person','alice']),
                    JSON(['person','bob']),
                    JSON(['person','charlie'])
                    ])
    ])

您还可以执行
LJObj.AddPair('guestlist',LGuestList)因此,你不必调用<代码> TjShan-Boo.CueTeAd(/Cube)显式。@ ReMyLeBeAO'PoePoT——只是显式的,但也很干净。谢谢,我会考虑的。下次我在做JSON的时候,我会试试这个。我想你最好去JSON.org阅读非常简单的JSON规范。了解对象、数组和值。大多数JSON库使用相同的术语。因此,您似乎有一个误解,因为您希望一个对象包含一个数组。一旦对象、数组和值这三个术语被很好地理解,所有这些库都将变得显而易见。@DavidHeffernan阅读并用更好的术语更新了这个问题