Newtonsoft json 访问数组 json

Newtonsoft json access array inside json

我有一个这样的 json 文件:

{
   "foo": "bar",
   "1": 0,
   "array": [
      "foo",
      "bar"
   ]
}

我可以像这样访问“foo”和“1”:

using Newtonsoft.Json

JObject o = JObject.Parse(json)
Console.WriteLine((string)o["foo"]) // prints "bar"
Console.WriteLine((int)o["1"]) // prints 0

但是我怎样才能访问数组呢?我需要一个字符串数组 string[].

您可以使用以下方法从 JArray 获取字符串数组:

o["array"].Select(x => x.Value<string>()).ToArray()
JArray jsonArray = (JArray)o["array"];
string[] stringArray = jsonArray.ToObject<string[]>();
  • JObject的索引运算符return是一个JToken需要转换为JArray
  • 您可以在其上调用 ToObject,您可以在其中将 return 类型指定为字符串数组

更新 #1

嗯,您不需要显式地将 JToken 转换为 JArray,因为 ToObject 是在 JToken 上定义的。所以下面的代码就足够了:

var stringArray = o["array"].ToObject<string[]>();

您可以使用以下方式访问数组(JArray 的实例):

JArray arr = (JArray)o["array"];

要迭代它的元素,您可以使用数组的 Children method

完整代码示例:

using System;
using Newtonsoft.Json.Linq;

namespace ConsoleAppCS
{
    class Program
    {
        static void Main(string[] args)
        {
            string jsonStr = "{ \"foo\": \"bar\", \"1\": 0, \"array\": [ \"foo\", \"bar\" ] }";

            JObject o = JObject.Parse(jsonStr);
            Console.WriteLine((string)o["foo"]); // prints "bar"
            Console.WriteLine((int)o["1"]);      // prints 0
            JArray arr = (JArray)o["array"];
            foreach (var elem in arr.Children())
            {
                Console.WriteLine((string)elem);    // print the array element
            }
        }
    }
}

输出:

bar
0
foo
bar