新手请教一个问题,Javascript 如何通过字符串取 json 对象中的属性? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
zhouyou457
V2EX    Javascript

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

  •  
  •   zhouyou457 2017-11-08 16:50:52 +08:00 5438 次点击
    这是一个创建于 2925 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT

    json 数据类似:

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

    期望:

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

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

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


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

    php 里写过一个[类似的]( https://github.com/BarnettZhou/Parser/blob/master/src/AbstractParser.php#L270),270 行开始。
    wxsm
        11
    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
        12
    fds  
       2017-11-08 17:45:32 +08:00
    ……好吧,那没必要提 JSON 呀,而且你帖子里写的还是“ json 数据”,直接说普通 js 对象呗……我也推荐直接用 lodash 的 get 函数,有需要可以直接看源码。
    Troevil
        13
    Troevil  
       2017-11-08 17:51:41 +08:00
    @wxsm 少考虑了 array 的情况 xx[1].xx
    sammo
        14
    sammo  
       2017-11-08 18:04:22 +08:00
    新手一定知道你遇到的这种问题是不是很 “经典” 的?如果是很经典的那么现成的库比如 lodash underscore 总能找到
    ( 不限于 js 语言 )
    O3YwA1ENkb7i35XJ
        15
    O3YwA1ENkb7i35XJ  
       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
        16
    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
        17
    flowfire  
       2017-12-01 14:04:49 +08:00
    如果你不用严格模式可以试试 with [光速逃
    var json = JSON.parse('{"a": 1}');
    with (json) {
    console.log(a);
    }
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5240 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 07:58 PVG 15:58 LAX 23:58 JFK 02:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86