You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何嵌套插入多个TJsonArray且保留对应属性名称

Delphi TJSONObject 嵌套数组添加属性名解决方案

JSON 规范中,数组(TJSONArray)是有序无键的值集合,只有对象(TJSONObject)的属性才支持自定义属性名。你之前的实现直接把两个数组插入到了aArray数组中,自然不会生成属性名,属于结构选型错误。

以下为两种适配不同业务需求的解决方案:

方案1:将aArray改为对象类型(推荐,符合带属性名的常规结构需求)

预期输出结构示例:

"aArray": {
    "aSubString": "aSubString",
    "subFoldersAccess": [1,2,3],
    "accessToInvoice": false
}

修改后的完整代码:

jsonObj := TJsonObject.Create;
try
  ParamsObj := jsonObj.O['params'];
  ParamsObj.FromSimpleObject(SessionInfo, false);
  jsonObj['facadeClassName'] := 'dk.vs.int.IntFac';
  jsonObj['methodName']      := 'typesTest';
  argsObj                    := jsonObj.A['args'].AddObject;
  argsObj['aChar']           := input._get_aChar;
  argsObj['aString']         := input._get_aString;
  argsObj['aDouble']         := input._get_aDouble;
  argsObj['aInt']            := input._get_aInt;
  argsObj['aLong']           := input._get_aLong;
  argsObj['aBool']           := input._get_aBool;
  argsObj['aSpecialEnum']    := input._get_aSpecialEnum;
  argsObj['aEnum']           := input._get_aEnum;
  argsObj['aNotherEnum']     := input._get_aNotherEnum;
  argsObj['aBigEnum']        := input._get_aBigEnum;

  // 核心修改:aArray改为对象类型,而非数组
  aArrayObj := argsObj.O['aArray'];
  // 给第一个值设置属性名
  aArrayObj['aSubString'] := dk_vs_int_IntFac_i.SupportedTypeSubStateArray(input._get_aArray)[0]._get_aSubString;
  // 给subArray设置自定义属性名,示例为subFoldersAccess,可自行修改
  subArray := aArrayObj.A['subFoldersAccess'];
  for n := 0 to length(hasAccessToFolders) -1 do 
    subArray.Insert(n, mapperStateArray(VirksomhedItemsStateArray(SupportedTypeSubStateArray(input._get_aArray)[0]._get_aSubArray)[0].hasAccessToFolders)[n]);
  // 给整型数组设置属性名accessToInvoice
  aArrayObj['accessToInvoice'] := CompanyItemState._get_accessToInvoice;

  output := jsonObj.ToJSON({Compact:=}False);
finally
  jsonObj.Free;
end;

方案2:保留aArray为数组类型,数组元素为带单属性的对象

如果业务要求aArray必须为数组结构,可将每个值包装为独立对象,再插入数组:
预期输出结构示例:

"aArray": [
    {"aSubString": "aSubString"},
    {"subFoldersAccess": [1,2,3]},
    {"accessToInvoice": false}
]

核心修改代码片段:

// 保留aArray为数组类型
jsonaArray := argsObj.A['aArray'];
// 插入第一个对象,带aSubString属性
jsonaArray.AddObject['aSubString'] := dk_vs_int_IntFac_i.SupportedTypeSubStateArray(input._get_aArray)[0]._get_aSubString;
// 插入第二个对象,带subArray的自定义属性名
subArray := jsonaArray.AddObject.A['subFoldersAccess'];
for n := 0 to length(hasAccessToFolders) -1 do 
  subArray.Insert(n, mapperStateArray(VirksomhedItemsStateArray(SupportedTypeSubStateArray(input._get_aArray)[0]._get_aSubArray)[0].hasAccessToFolders)[n]);
// 插入第三个对象,带accessToInvoice属性
jsonaArray.AddObject['accessToInvoice'] := CompanyItemState._get_accessToInvoice;

内容的提问来源于stack exchange,提问作者Per

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:54:00