我有一个包含多个属性和子属性的字符串,我想将其转换为 JSON 对象。我当前拥有的字符串的格式如下:
"{"menuId":"1","menuItemDetails.itemDetailsId":"4","menuItemDetails.itemType.itemTypeId":"4","accessGroups":"","menuItemDetails.name":"","menuItemDetails.route":"","menuItemDetails.displayRule":"","menuItemDetails.continueMode":"","menuItemDetails.isSilent":"0","menuItemDetails.message.messageId":"26","menuItemDetails.title.messageId":"","menuItemDetails.defaultMessage.messageId":"","menuItemDetails.onSelect.messageId":"","menuItemDetails.action.actionId":"2","menuItemDetails.action.actionTypeId":"2","menuItemDetails.action.name":"GenerateViewMembersAction","menuItemDetails.action.fullyQualifiedName":"test.actions.sharedplans.GenerateViewMembersAction","menuItemDetails.action.plugin.pluginId":"1"}"
如果我执行正常的 JSON.parse,我会得到如下所示的对象:
accessGroups
:
""
menuId
:
"1"
menuItemDetails.action.actionId
:
"2"
menuItemDetails.action.actionTypeId
:
"2"
menuItemDetails.action.fullyQualifiedName
:
"test.GenerateViewMembersAction"
menuItemDetails.action.name
:
"GenerateViewMembersAction"
我想按属性名称进行分组,因此我得到以下结果:
{
menuId: 1
,menuItemDetails: {
action: {
actionId: 1
,actionTypeId: 2
...
}
,name: "GenerateView..."
}
}
谁能帮我解决这个问题?
编辑:为了更深入地了解事情,我的情况是一个 HTML 元素列表,每个元素都有一个名称和一个值,我想从中构建 JSON 对象。这确实使我能够控制 JSON 字符串,或者允许我在需要时直接创建 JSON 对象。
最佳答案
您不能按原样使用 JSON 解析器,因为它只是将 "menuItemDetails.itemDetailsId"
视为整体标识符。毕竟,它怎么知道这实际上描述了一个嵌套对象。
您必须编写自己的解析器来读取字符串并创建对象结构,同时考虑到您的特殊情况。然而,这是一项相当繁琐的任务(如果您想正确完成的话)。
我会采用两步法。首先使用内置的 JSON 解析器创建一个常规对象。然后,迭代对象属性并简单地拆分包含 .
的所有属性,并将它们组合成新的嵌套对象。您可以使用常规代码来复制对象 ( which is not trivial as well ),然后添加特殊规则来相应地拆分包含 .
的键。
分割对象路径可以像下面这样完成(但这不考虑重复的路径!):
obj = {"test.foo.bar.baz":"value","one.two":"anothervalue"};
var out = {};
Object.entries(obj).forEach(
(e)=> e[0].split(".")
.reduceRight(function(acc, val,i) {
return (i==0) ? out[val] = acc : {[val] : acc};
}, e[1])
);
console.log(out);
如果您可以控制它,最简单的事情可能就是首先纠正输入字符串。
关于Javascript JSON 组子属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43896799/