我有一个包含多个属性和子属性的字符串,我想将其转换为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"
我想通过propreties名称分组,所以我得到以下内容:
{
menuId: 1
,menuItemDetails: {
action: {
actionId: 1
,actionTypeId: 2
...
}
,name: "GenerateView..."
}
}
任何人都可以帮我解决这个问题吗?
编辑:为了更加透彻,我的案例是一个HTML元素列表,每个元素都有一个名称和一个值,我想从中构建JSON对象。这确实让我可以控制JSON字符串,或者允许我在需要时直接创建JSON对象。
答案 0 :(得分:3)
您不能按原样使用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);

如果您可以控制它,最简单的方法是首先纠正输入字符串。