3

假设我正在处理这样的 JSON:

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

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

4

2 回答 2

2

use recursion:

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);​

a here - parsed JSON, b - result;

b structure is

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

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

check http://jsfiddle.net/NkTst/2/ if you still need extended info on comments

于 2012-10-08T06:35:26.093 回答
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":""}) 做到了,你有一个漂亮的小 json 到表格转换器(轻松转换为 CSV)!

不过,您问题中的 json 不可见。

于 2014-08-15T17:51:25.383 回答