0

すべてのノードをトラバースして、レベルが事前に決定されていない複雑なjsonから必要なフィールドを見つけることは可能ですか?

{
    "_index": "test",
    "_type": "news",
    "_source": {
        "partnerName": "propertyFile 9",
        "relatedSources": "null",
        "entityCount": "50",
        "Categories": {
            "Types": {
                "Events": [{
                    "count": 1,
                    "term": "Time",
                    "Time": [{
                        "term": "Dec 9",
                        "Dec_9": [{
                            "count": 1,
                            "term": "2012"
                        }]
                        }]
                    }, {
                    "count": 4,
                    "term": "News",
                    "News": [{
                        "term": "Germany",
                        "Germany": [{
                            "count": 1,
                            "term": "Election"
                        }],
                        "currency": "Euro (EUR)"
                    }, {
                        "term": "Egypt",
                        "Egypt": [{
                            "count": 1,
                            "term": "Revolution"
                        }]
                        }]
                    }]
                }
        }
    }
}

最初のレベルに入ることができましたが、最初のレベルにフィールド名が存在しない場合、どうすれば 2 番目のレベルに進むことができますか。これが私が始めた方法です。http://jsfiddle.net/W8qhA/1/

4

3 に答える 3

1

あなたが提示した構造のオブジェクトで動作する関数を作成しました。同じ名前のキーが複数ある場合は、最初に検出したキーを返すだけです。

var findDeepKey = function(obj, key){
    var results = [];

    if (typeof obj !== 'object') return null;

    for (var k in obj) {
        if (k === key) return obj[k];
    }

    for (var k in obj) {
        if (typeof obj[k] === 'object') {
            if (obj[k].length) {
                for (var i = 0, il = obj[k].length; i < il; i++) {
                    results.push(findDeepKey(obj[k][i], key));
                }
            } else {
                for (var kk in obj[k]) {
                    if (kk === key) return obj[k][kk];
                    results.push(findDeepKey(obj[k][kk], key));
                }
            }
        }
    }

    for (var i = 0, il = results.length; i < il; i++) {
        if (results[i] !== null) return results[i];
    }

    return null;
};

デモを見る

于 2012-07-02T05:59:52.363 に答える
1

これで問題が解決することを願っています。いくつかの機能と少しの説明があります。それがあなたを助けることを願っています。 JavaScript を使用して JSON オブジェクト ツリーのすべてのノードをトラバースする

于 2012-07-02T05:44:27.537 に答える
0

http://james.newtonking.com/projects/json-net.aspxを使用できます

于 2012-07-02T06:24:59.637 に答える