【问题标题】:yajl_tree_get return 0 when path node name is the same当路径节点名称相同时,yajl_tree_get 返回 0
【发布时间】:2011-12-03 15:00:34
【问题描述】:

这是 JSON 文本:

{
    "retcode": 0,
    "result": {
        "info": [{
            "face": 180,
            "flag": 8913472,
            "nick": "tom",
            "uin": 2951718842
        }, {
            "face": 252,
            "flag": 512,
            "nick": "jim",
            "uin": 824317252
        }, {
            "face": 0,
            "flag": 17302018,
            "nick": "hanmeimei",
            "uin": 1179162105
        }, {
            "face": 522,
            "flag": 4719104,
            "nick": "lilei",
            "uin": 108219029
        }]
    }
}

下面是获取JSON文本“nick”节点的函数

char* getNickName()
{
    char* path[20] = { "result", "info", "nick", (char *) 0 }; 
    yajl_val v;
    yajl_val node;
    node = yajl_tree_parse(buffer, errbuf, sizeof(errbuf));
    v = yajl_tree_get(node, path, yajl_t_string);
    return YAJL_GET_STRING(v);
}

function getNickName 应该返回 lilei 或类似的东西,但实际上它总是返回 0。

既然不是只有一个名为“nick”的节点,那么yajl如何一一解析“nick”呢?

如何获得 tomjim 等值。

【问题讨论】:

    标签: c json yajl


    【解决方案1】:

    您需要先获取 info 数组。然后遍历数组。

    char* path[20] = { "result", "info", (char *) 0 }; 
    yajl_val v;
    yajl_val info;
    info = yajl_tree_parse(buffer, errbuf, sizeof(errbuf));
    if (info && YAJL_IS_ARRAY(info)) {
        size_t len = info->u.array.len;
        for(int i = 0;i < len; i++) {
            const char *n_path[] = {"nick",(const char *)0};
            yajl_val n = yajl_tree_get(f,n_path,yajl_t_string);
    
            // here is what you need
            char *nickname = YAJL_GET_STRING(n);
    
    }
    

    完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 2022-12-24
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多