新手请教一个问题,javascript 如何通过字符串取 json 对象中的属性?

2017-11-08 16:50:52 +08:00
 zhouyou457

RT

json 数据类似:

{
  "obj": {
    "id": "1",
    "value": "2"
  },
  "name" : "3"
}

期望:

使用"obj.id"获取 json 对象中的 obj.id 的值

请问有什么工具能实现嘛?

5080 次点击
所在节点    JavaScript
17 条回复
whypool
2017-11-08 16:59:59 +08:00
是 json 对象只能能获取,不用啥工具,
json 字符串可以直接转 json 对象,不用啥工具,es5 自带 api
fds
2017-11-08 17:01:26 +08:00
JSON.parse(字符串) 返回 js 对象
wenzichel
2017-11-08 17:04:39 +08:00
sf 中有人问过这个问题,你可以参考下: https://segmentfault.com/q/1010000011812768
autoxbc
2017-11-08 17:06:42 +08:00
动态生成代码,你需要 eval() 或者 new Function()
zhouyou457
2017-11-08 17:06:59 +08:00
@whypool
@fds
两位可能没看明白什么意思...我现在需要实现使用字符串获取 json 对象中的值...


@wenzichel 这个不错,感谢
zthxxx
2017-11-08 17:19:51 +08:00
lhstock
2017-11-08 17:21:40 +08:00
@zhouyou457 我可能也没看懂你的意思。json 对象是指对象吗。。。。? js 里有非 json 格式的对象吗?
cloudzqy
2017-11-08 17:22:30 +08:00
你说 json 有点误导人了,直接说通过'obj.id'取对象里的值就行了。
lodash 里面的 get 行,实现原理,看楼上的 sf 答案。
zthxxx
2017-11-08 17:22:42 +08:00
另外,正确说法是 「 JS 对象字面量」,你说的 「 JSON 对象」误导了前几楼的人
zhouxuchen
2017-11-08 17:33:34 +08:00
楼主的问题描述没问题啊……我看了标题就懂了。

php 里写过一个[类似的]( https://github.com/BarnettZhou/Parser/blob/master/src/AbstractParser.php#L270),270 行开始。
wxsm
2017-11-08 17:39:47 +08:00
```javascript
var deep_value = function(obj, path){
for (var i=0, path=path.split('.'), len=path.length; i<len; i++){
obj = obj[path[i]];
};
return obj;
};
```
fds
2017-11-08 17:45:32 +08:00
……好吧,那没必要提 JSON 呀,而且你帖子里写的还是“ json 数据”,直接说普通 js 对象呗……我也推荐直接用 lodash 的 get 函数,有需要可以直接看源码。
Troevil
2017-11-08 17:51:41 +08:00
@wxsm 少考虑了 array 的情况 xx[1].xx
sammo
2017-11-08 18:04:22 +08:00
新手一定知道你遇到的这种问题是不是很 “经典” 的?如果是很经典的那么现成的库比如 lodash underscore 总能找到
( 不限于 js 语言 )
xqin
2017-11-08 21:42:40 +08:00
通过 `new Function` 来做, 如果为了防止出错, 可以在里面加 try/catch

```javascript
var a = {
"obj": {
"id": "1",
"value": "2",
"test":[
{x:123, y:{z:9999,a:[555]}}
]
},
"name" : "3"
}

function getValue (obj, key) {
return new Function('x', 'return x.' + key)(obj)
}

console.log(getValue(a, 'obj.id'))
console.log(getValue(a, 'name'))
console.log(getValue(a, 'obj.test[0].x'))
console.log(getValue(a, 'obj.test[0].y.z'))
console.log(getValue(a, 'obj.test[0].y.a[0]'))
```
shenjo
2017-11-08 22:16:58 +08:00
lodash:

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// => 3

_.get(object, ['a', '0', 'b', 'c']);
// => 3

_.get(object, 'a.b.c', 'default');
// => 'default'
flowfire
2017-12-01 14:04:49 +08:00
如果你不用严格模式可以试试 with [光速逃
var json = JSON.parse('{"a": 1}');
with (json) {
console.log(a);
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/404669

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX