如何拼合嵌套的JSON?

时间:2012-10-08 05:57:44

标签: javascript jquery json

假设我正在处理JSON:

http://hndroidapi.appspot.com/nestedcomments/format/json/id/4620423?appid=hntoolbar&callback=

可以无限嵌套。我想以“扁平化”格式提取所有评论信息,只是提取用户名列表和评论内容,而不必担心评论的“级别”。我如何使用Javascript / JQuery做这样的事情?

2 个答案:

答案 0 :(得分:2)

使用递归:

var getall = function(comments,out) {
    var out = out || {};
    var cuser = undefined;
    var comment;
    for (var key in comments) {
        if (key == 'username') {
            cuser = comments[key];
            continue;
        }
        if (key == 'comment') {
            comment = comments[key];
            continue;
        }
        var mytype = typeof(comments[key]);
        if (mytype == 'object'
        || mytype == 'array') {
            out=getall(comments[key],out);
        };
    }
    if (cuser !== undefined) {
        if (out[cuser] === undefined) {
            out[cuser] = [];
        }

       out[cuser].push(comment);
    }
    return (out);
}
b=getall(a);
console.log(b);​

这里 - 解析JSON,b - 结果;

b结构是

{user1: [comment,comment,comment],user2: [] ...}

http://jsfiddle.net/NkTst/1/

如果您仍需要有关评论的扩展信息,请检查http://jsfiddle.net/NkTst/2/

答案 1 :(得分:0)

这是我在python中必须这样做时所做的: (虽然不完整,但我会尝试在javascript中稍后进行实践。) 我发布了这个,因为递归的想法在这个中更清楚。

#Builds the names and makes a nested list with {"table.hierarchy.id":value} pairs:
def undic(dic,levs=0,tmp=""):
    if(isinstance(dic,dict)):
        return([undic(dic[d],levs=levs+1,tmp=tmp+d+".") for d in dic.keys()])
    else:
        return {tmp : dic}

#Flattens the list to something we can easilly work with:
def flat_content(dic):
    ll=undic(dic)
    if(isinstance(ll[0],dict)):
        return(ll)
    return(reduce(lambda x,y:x+y,ll))

然后找到唯一的列名并保持行级别的第零级别的行名称,使一些实用程序函数处理丢失的键等(我用.update({" missingKey&#34) ;:""})你有一个很好的小json到表转换器(很容易转换为CSV)!

虽然你的问题中的json不可见。