【发布时间】:2018-12-15 05:28:38
【问题描述】:
我想使用 ISuperObject 创建我的 JSON 文件,但我需要知道如何将一个对象添加到另一个对象中。例如,这是我的代码:
aJSONChannel := SO;
for J := 0 to ListTest.Count - 1 do
begin
aJSONChannel.S['a'] := ListTest[j].Code;
aJSONChannel.S['b'] := ListTest[j].Valeur;
// Create node "tranlsations"
aJSONChannel.O['translations'] := SA([]);
for I := 0 to ListTest[j].ListTranslation.Count-1 do
begin
aJSONTransaltionsLang := SO;
aJSONTransaltionsLang.S['title'] := ListTest[j].ListTranslation[i].Title;
aJSONChannel.A['translations'].Add(aJSONTransaltions);
end;
结果:
{
"b": "valeur",
"a": "code",
"translations": [
{"title" : "fr"},
{"title" : "en"},
{"title" : "de"},
{"title" : "it"}
],
}
但我想要这个:
{
"b": "valeur",
"a": "code",
"translations": {
"fr" : {"title" : "fr"},
"en" : {"title" : "en"},
"de" : {"title" : "de"},
"it" : {"title" : "it"}
},
}
我使用SA([]),但我不想创建一个数组,只是另一个对象中的一个对象。
我尝试使用SO([]) 而不是SA([]),但是如何像使用SA([]) 一样向对象添加“节点”?
【问题讨论】:
-
SA返回一个数组。如果你不想要一个数组,那么使用SO来返回一个新对象。 -
好的,但我如何将“翻译”链接到新对象? “aJSONChannel.O['translations'] := SO;”但我做不到:“aJSONChannel.O['translations'].Add(aJSONTransaltions);”
-
您不会“添加”到对象。您只需将其直接分配给您想要的元素名称。例如
Obj.O['newNestedObject']:= SO;或在外面使用SO,用它的数据填充它,然后Obj.O['newNestedObject']:= OtherObj; -
作为替代的 JSON 引擎,我在很大程度上基于 Delphi 的 Variant 类型创建了 jsonDoc。一个 Variant 可以像任何其他值一样包含一个 IUnknown 导数,因此使用 jsonDoc 它可能看起来像这样:
JSON(d['translations'])['fr']:=JSON(['title','fr']);