使用JSON.Net解析JArray内部的JArray

时间:2017-05-04 16:50:18

标签: arrays json.net

我目前正在尝试从json文件中另一个数组内的数组中获取数据。不幸的是,我对LINQ并不是很了解,所以我在C#中做到了这一切

JSON文件示例

"Fruits": [
            {
              "type": "banana",
              "FunFact": [
                {
                  "$": "Yellow"
                },
                {
                  "$": "Long"
                },
                {
                  "$": "People love them"
                }
              ]

            }
      ]

目前这是我的代码。

var csfdata = token.Value<JArray>("Fruit");
            //There are 8 of these Fruit Arrays
            var csfcount = csfdata.Count;
            Console.WriteLine("Length of CSFArray is {0}", csfcount.ToString());
            for (int i = 0; i < csfcount; i++)
            {
            //Work just fine
            Console.WriteLine("Fruit: {0}", token.SelectToken("Fruit[" + i.ToString() +"].type").ToString());

            //Crashes here saying that FunFact is null or empty when I am trying to get a count of how many is in FunFact
            var tfdata = token.Value<JArray>("FunFact");
            var tfcount = tfdata.Count;

            }

任何建议,遗憾的是我现在无法做LINQ

1 个答案:

答案 0 :(得分:2)

首先,两个初步问题:

  • 您的JSON无效,缺少外部花括号{}。如果没有外括号,Json.NET将无法解析您的JSON。
  • JSON中的root属性名为"Fruits",但在您的代码中使用属性名称"Fruit"。这些需要匹配。

我怀疑这两个问题都是问题中的拼写错误。

假设这些初步问题已得到解决,您的问题是,在表达式token.Value<JArray>("FunFact")中,您正在使用方法JToken.Value<T>(Object key)从根"FunFact"获取令牌token的值{ {1}}然后将其转换为JArray类型。但是没有属性"FunFact"属于根令牌。相反它属于csfdata[i],所以你需要这样做:

var tfdata = csfdata[i].Value<JArray>("FunFact");

<强>更新

我想知道它是一个数组还是一个对象,我怎么能通过代码来判断?

在这种情况下,请勿使用JToken.Value<T>(Object key)方法,只需使用item indexer直接获取值,然后直接检查类型:

var tfdata = csfdata[i]["FunFact"];
if (tfdata is JArray)
{
    var tfArray = (JArray)tfdata;
    // Process the array
}
else if (tfdata is JObject)
{
    var tfObj = (JObject)tfdata;
    // Process the object
}

或者,请检查Type属性:

var tfdata = csfdata[i]["FunFact"];
if (tfdata != null && tfdata.Type == JTokenType.Array)
{
    var tfArray = (JArray)tfdata;
    // Process the array
}
else if (tfdata != null && tfdata.Type == JTokenType.Object)
{
    var tfObj = (JObject)tfdata;
    // Process the object
}
当您期望值可以转换为某种类型并希望抛出异常时,

JToken.Value<T>(Object key)非常有用。