Javascript JSON 组子属性名称

标签 javascript html json

我有一个包含多个属性和子属性的字符串,我想将其转换为 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/

相关文章:

javascript - Discord Bot 设置某人的昵称

javascript - 禁止在 ASP.NET 中将特殊字符输入到 @Html.TextboxFor

python - 如何用漂亮的汤解析长网页?

javascript - Bootstrap 3 旋转木马和导航栏不工作

javascript - 用于在 javascript 验证中接受所有类型电话号码的正则表达式

html - CSS - 当图像向左浮动时,内容是一个相对的

javascript - Node JS 无法读取未定义的属性 'length'

javascript - 解析网站中的 JSON 数据

javascript - 如何让 Jade 的外部 JSON 从 Express 渲染?

javascript - React 组件 - 创建它们的正确方法是什么?