-2

これは、私が使用している JSON 文字列です。

string jsonText = "{
    "?xml" : {
        "@version" : "1.0",
        "@encoding" : "UTF-8",
        "@standalone" : "yes"
    },
    "Grid" : {
        "DataRow" : [{
                "DataItem" : [{
                        "@name" : "SYMBOL",
                        "#text" : "005930"
                    }, {
                        "@name" : "NAME",
                        "#text" : "Samsung Electronics"
                    }, {
                        "@name" : "PRICE",
                        "#text" : "1004.3"
                    }, {
                        "@name" : "VOLUME",
                        "#text" : "273.182"
                    }, {
                        "@name" : "AGG_VOLUME",
                        "#text" : "302.894"
                    }
                ]
            }, {
                "DataItem" : [{
                        "@name" : "SYMBOL",
                        "#text" : "AAPL"
                    }, {
                        "@name" : "NAME",
                        "#text" : "Apple Inc."
                    }, {
                        "@name" : "PRICE",
                        "#text" : "99"
                    }, {
                        "@name" : "VOLUME",
                        "#text" : "32936.4"
                    }, {
                        "@name" : "AGG_VOLUME",
                        "#text" : "33078.769"
                    }
                ]
            }, {
                "DataItem" : [{
                        "@name" : "SYMBOL",
                        "#text" : "MSFT"
                    }, {
                        "@name" : "NAME",
                        "#text" : "Microsoft Corporation"
                    }, {
                        "@name" : "PRICE",
                        "#text" : "42"
                    }, {
                        "@name" : "VOLUME",
                        "#text" : "103441.6"
                    }, {
                        "@name" : "AGG_VOLUME",
                        "#text" : "1324432.074"
                    }
                ]
            }
        ]
    }
}"
JObject feed = JObject.Parse(jsonText);

SYMBOL、NAME、PRICE、および AGG_VOLUME の値のリストを取得しようとしています。これまでの私のコードは次のとおりです。

var covg = feed["DataItem"]["@name"].Select(f => (string)f.SelectToken("#text"));

しかし、次のエラーが発生します。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

私は何を間違っていますか?

4

2 に答える 2

2

JToken.SelectTokens()JSONPath クエリ構文をサポートします。この構文を使用して、必要なクエリを実行できます。

  • ".."ワイルドカード再帰降下演算子です。したがって、JSON 階層内のどこにあるかに関係なく、feed.SelectTokens("..DataItem")名前が付けられたすべての JSON プロパティの値を見つけます。DataItem

  • "[?(@.@name == 'Value')]"@namevalue で名前が付けられたプロパティを持つ配列内のオブジェクトをクエリしますValue

したがって、以下は必要なことを行います。

var feed = JObject.Parse(jsonText);

var query = from item in feed.SelectTokens("..DataItem")
            select new
            {
                SYMBOL = (string)item.SelectToken("[?(@.@name == 'SYMBOL')].#text"),
                NAME = (string)item.SelectToken("[?(@.@name == 'NAME')].#text"),
                PRICE = (string)item.SelectToken("[?(@.@name == 'PRICE')].#text"),
                AGG_VOLUME = (string)item.SelectToken("[?(@.@name == 'AGG_VOLUME')].#text")
            };
var list = query.ToList();
于 2016-05-10T21:20:23.027 に答える
1

プロパティを直接含まないfeedルートを参照しているため、このエラーが発生しています。したがって、null を返します。次に、この null 式を逆参照しようとすると、. JObjectDataItemfeed["DataItem"]NullReferenceException

取得しようとしているデータは、JSON のいくつかのレイヤーにあるため、クエリでこれを考慮する必要があります。たとえば、JSONのすべての値のリストを取得するにはSYMBOL、次のようにする必要があります。

List<string> symbols = 
    feed.SelectToken("Grid.DataRow")
        .SelectMany(jt => jt["DataItem"])
        .Where(jt => (string)jt["@name"] == "SYMBOL")
        .Select(jt => (string)jt["#text"])
        .ToList();

フィドル: https://dotnetfiddle.net/jxZGZC

于 2016-05-10T21:19:27.560 に答える