【问题标题】:LINQ to JSON - SelectToken ErrorLINQ to JSON - SelectToken 错误
【发布时间】:2016-05-10 20:23:48
【问题描述】:

这是我正在使用的 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"));

但我收到以下错误:

对象引用未设置为对象的实例。

我做错了什么?

【问题讨论】:

  • 第 1 讲:如何调试代码...编写更小的代码。 var aaaa = feed["DataItem"] 然后检查aaaa 是否为空等......

标签: c# linq json.net linq-to-json


【解决方案1】:

JToken.SelectTokens() 支持JSONPath query syntax。您可以使用此语法来执行您需要的查询:

  • ".." 是通配符递归下降运算符。因此,feed.SelectTokens("..DataItem") 可以找到名为 DataItem 的所有 JSON 属性的值,无论它们在 JSON 层次结构中的什么位置。

  • "[?(@.@name == 'Value')]" 查询数组中具有名为@name 且值为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();

【讨论】:

    【解决方案2】:

    您收到此错误是因为 feed 指的是不直接包含 DataItem 属性的根 JObject。因此feed["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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多