动态键的JSON字符串解析

3

我有以下JSON数据:

var raw = {"raw":[{"W4Jlp9HKx_MVImNZuJwPqA!!:dgIN_ZskRAf5OtpgZ7tYLQ!!":{"name":"Name1","uniqID":"W4Jlp9HKx_MVImNZuJwPqA!!:dgIN_ZskRAf5OtpgZ7tYLQ!!"},"uFzQkOcsEwmRDGlob11Qiw!!:ArYiisKagqjnqMGfbKP7Yw!!":{"name":"Name2","uniqID":"uFzQkOcsEwmRDGlob11Qiw!!:ArYiisKagqjnqMGfbKP7Yw!!"},"fWcL6bvhCvp1wO95-7K3LA!!:XNYxDArq9E_6u2yaDbST0A!!":{"name":"Name3","uniqID":"fWcL6bvhCvp1wO95-7K3LA!!:XNYxDArq9E_6u2yaDbST0A!!"}}]}

密钥是动态的,即第一个密钥“W4Jlp9HKx_MVImNZuJwPqA!!:dgIN_ZskRAf5OtpgZ7tYLQ!!”会随着我们对JSON URL进行的每个调用而更改。

我想解析JSON数据并将数据存储在Javascript变量中。

我尝试使用以下方法解析:

var arra = JSON.parse(raw);

尝试使用以下方式获取该值:
arra.raw[0].W4Jlp9HKx_MVImNZuJwPqA!!:dgIN_ZskRAf5OtpgZ7tYLQ!!.name

但是这并没有起到帮助作用,我无法获取其中的值。我也不确定为什么会发生这种情况。是因为键包含特殊字符吗?

如果有一种方法可以列出键,并使用键索引或类似的方式获取值,那将是很好的。例如:

arra.raw[0].key(0).name

我希望不需要提供密钥,因为它会随着每次调用而更改。即使没有使用密钥名称的工作解决方案也可以。

如果可能的话,我更喜欢用Javascript实现,如果不行,请随时告诉我可以用什么语言实现。

非常感谢!

--- 编辑 ---

在评论中已经给出了使用具有特殊字符的键获取值的答案,我必须使用[]符号来获取结果。非常感谢大家!!但是关于使用键位置获取结果的第二个问题,键名仍然保持开放状态。



从https://dev59.com/X2ct5IYBdhLWcg3wpfFc,您可以使用方括号表示法:`arra.raw [0] ["W4Jlp9HKx_MVImNZuJwPqA !!:dgIN_ZskRAf5OtpgZ7tYLQ !!"] .name` - apsillers
4
可以更改JSON数据源吗?因为具有随机或不可知属性名称的对象并不是很有用,使用数组会更好。 - James
!! 是一个双重否定。请使用方括号表示法! - Jonas Wilms
@James 不好意思,我们无法控制源代码。 :/ - iMan
@apsillers 非常感谢! - iMan
2个回答

2

这里有另外一种解决方案https://jsfiddle.net/bm1n59hf/1/

var data = {"raw":[{"W4Jlp9HKx_MVImNZuJwPqA!!:dgIN_ZskRAf5OtpgZ7tYLQ!!":{"name":"Name1","uniqID":"W4Jlp9HKx_MVImNZuJwPqA!!:dgIN_ZskRAf5OtpgZ7tYLQ!!"},"uFzQkOcsEwmRDGlob11Qiw!!:ArYiisKagqjnqMGfbKP7Yw!!":{"name":"Name2","uniqID":"uFzQkOcsEwmRDGlob11Qiw!!:ArYiisKagqjnqMGfbKP7Yw!!"},"fWcL6bvhCvp1wO95-7K3LA!!:XNYxDArq9E_6u2yaDbST0A!!":{"name":"Name3","uniqID":"fWcL6bvhCvp1wO95-7K3LA!!:XNYxDArq9E_6u2yaDbST0A!!"}}]};

for(var key in data.raw[0]){
 console.log("KEY: " + key + "    Name: " + data.raw[0][key].name + "   ");
}


非常感谢。这很顺利。 - iMan

1
arra.raw[0].key(0).name

如果您在实现之前先实施了关键字,可能会起作用:

Object.defineProperty(Object.prototype,"key",{
 enumerable:false,
 value: function(key){
    return this[Object.keys(this)[key]||key];
  }
});

或者如果您不介意使用本地方法:
Object.values(arra.raw[0])[0].name

谢谢,我会尝试的。尽管我不完全理解那个函数中发生了什么。 - iMan
很酷,唯一令人困惑的是现在数组、对象、字符串、函数等都将拥有“keys”方法。 - dfsq
1
@dfsq,keykeys 可能会与 Maps 冲突... 如果使用多次,则可能很有用。 - Jonas Wilms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接