如何嵌套插入多个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
相关产品推荐
相关产品推荐

