使用JSON.Net/C#读取JSON数据中的根值

使用JSON.Net/C#读取JSON数据中的根值,c#,json,json.net,C#,Json,Json.net,很抱歉,我问了一个类似裸体的问题,但退休一段时间后,我发现自己忘记了一些事情 给定此示例json字符串: { "range": [ { "num": 0 }, { "num": 1 }, { "num": 2 }, { "num": 3 }, { "num": 4 }, { "num": 5 }, { "num": 6 }, { "num": 7 },

很抱歉,我问了一个类似裸体的问题,但退休一段时间后,我发现自己忘记了一些事情

给定此示例json字符串:

{
    "range": [
        { "num": 0 },
        { "num": 1 },
        { "num": 2 },
        { "num": 3 },
        { "num": 4 },
        { "num": 5 },
        { "num": 6 },
        { "num": 7 },
        { "num": 8 },
        { "num": 9 }
    ],
    "friends": [
      {
        "id": 0,
        "name": "Christian Cruz"
      },
      {
        "id": 1,
        "name": "Hunter Moon"
      },
      {
        "id": 2,
        "name": "Holden Gentry"
      }
    ]
}
我希望能够读取数据中每一行的根值(在本例中为“range”和“friends”),然后解析其余的值

void Main()
{
    var json = File.ReadAllText(@"c:\data\sample.json");
    JObject obj = JObject.Parse(json);
    foreach(JProperty child in obj.Children())
    {

    }
} 
当我遍历children集合(foreach(JProperty child…)时,我陷入了困境。我可以读取数组中的项(例如“num”、“id”和“name”),但无法读取根值(例如“range”和“friends”)


非常感谢您能借给老人的任何帮助。

将其反序列化为C对象要容易得多,例如:

public class RootObject
{
    public List<Range> range { get; set; }
    public List<Friend> friends { get; set; }
}

public class Range
{
    public int num { get; set; }
}

public class Friend
{
    public int id { get; set; }
    public string name { get; set; }
}

将其反序列化为C#对象要容易得多,例如:

public class RootObject
{
    public List<Range> range { get; set; }
    public List<Friend> friends { get; set; }
}

public class Range
{
    public int num { get; set; }
}

public class Friend
{
    public int id { get; set; }
    public string name { get; set; }
}

使用下面的这个小递归函数,您可以解压JSON以查看属性和值,而无需创建任何类

static void Main(string[] args)
{
    var json = "{\"range\":[{\"num\":0},{\"num\":1},{\"num\":2},{\"num\":3},{\"num\":4},{\"num\":5},{\"num\":6},{\"num\":7},{\"num\":8},{\"num\":9}],\"friends\":[{\"id\":0,\"name\":\"Christian Cruz\"},{\"id\":1,\"name\":\"Hunter Moon\"},{\"id\":2,\"name\":\"Holden Gentry\"}]}";

    JObject obj = JObject.Parse(json);

    void UnpackJson(JToken jobj, int indent)
    {
        if (jobj == null)
            return;

        var name = (jobj as JProperty)?.Name;
        if (name != null)
        {
            Console.Write(new string(' ', indent) + name + " :\n");
            indent += 4;
        }

        foreach (var child in jobj.Children())
        {
            var chname = (child as JProperty)?.Name;
            if (chname != null)
                Console.Write(new string(' ', indent) + chname + " : ");

            var value = (child as JProperty)?.Value;
            if (child.Values().Count() > 1)
            {
                if (chname != null || name != null)
                    Console.WriteLine();

                IEnumerable<JToken> jt = (value is JArray) ? child.Values() : child.Children();

                foreach (var val in jt)
                    UnpackJson(val, indent + 4);
            }
            else
            {
                if (value != null)
                    Console.WriteLine(value);
            }
        }
    }

    UnpackJson(obj, 0);

    Console.Read();
}

使用下面的这个小递归函数,您可以解压JSON以查看属性和值,而无需创建任何类

static void Main(string[] args)
{
    var json = "{\"range\":[{\"num\":0},{\"num\":1},{\"num\":2},{\"num\":3},{\"num\":4},{\"num\":5},{\"num\":6},{\"num\":7},{\"num\":8},{\"num\":9}],\"friends\":[{\"id\":0,\"name\":\"Christian Cruz\"},{\"id\":1,\"name\":\"Hunter Moon\"},{\"id\":2,\"name\":\"Holden Gentry\"}]}";

    JObject obj = JObject.Parse(json);

    void UnpackJson(JToken jobj, int indent)
    {
        if (jobj == null)
            return;

        var name = (jobj as JProperty)?.Name;
        if (name != null)
        {
            Console.Write(new string(' ', indent) + name + " :\n");
            indent += 4;
        }

        foreach (var child in jobj.Children())
        {
            var chname = (child as JProperty)?.Name;
            if (chname != null)
                Console.Write(new string(' ', indent) + chname + " : ");

            var value = (child as JProperty)?.Value;
            if (child.Values().Count() > 1)
            {
                if (chname != null || name != null)
                    Console.WriteLine();

                IEnumerable<JToken> jt = (value is JArray) ? child.Values() : child.Children();

                foreach (var val in jt)
                    UnpackJson(val, indent + 4);
            }
            else
            {
                if (value != null)
                    Console.WriteLine(value);
            }
        }
    }

    UnpackJson(obj, 0);

    Console.Read();
}

您可以使用SelectTokens,将json放入列表,然后遍历JProperty

var files = JObject.Parse(YourJson);
var recList = files.SelectTokens("$").ToList();
        foreach (JProperty item in recList.Children())
        {
            var key = item.Name.ToString(); //store the root item here
            var value = item.Value.ToString();
            //Do your stuffs
        }

您可以使用SelectTokens,将json放入列表,然后遍历JProperty

var files = JObject.Parse(YourJson);
var recList = files.SelectTokens("$").ToList();
        foreach (JProperty item in recList.Children())
        {
            var key = item.Name.ToString(); //store the root item here
            var value = item.Value.ToString();
            //Do your stuffs
        }

如果对其进行反序列化,则生成的类将在一行或两行代码中包含两个集合;查看每个
子项的
Name
属性时,会如预期的那样显示该属性的名称:如果对其进行反序列化,则生成的类将在一行或两行代码中包含两个集合;查看
 每个
子对象的Name
属性按照预期显示属性的名称:或者,如果你不想创建一堆类,只需使用
动态
对象:@HereticsMonkey,不。如果我的一个开发人员给我带来了这些,我会告诉他们去创建这些类。这样做很简单,甚至有些网站也会这样做你。当然,但既然OP提到他退休了,我想这是一个安全的赌注,它不是为了专业工作…:)专业与否,我相信OP更愿意用“正确”的方式做事“正确”的方式是重命名这些类/属性以遵循约定:)(我见过太多人在生产代码中离开
RootObject
)如果你想跳过一堆类的制作,也可以使用
动态对象:@HereticMonkey,不。如果我的一个开发人员把它带给我,我会告诉他们去制作这些类。这件事很简单,甚至有网站为你做。当然,但既然OP提到他退休了,我想这是一个安全的赌注,它不适合你专业工作…:)专业与否,我相信OP更愿意用“正确”的方式做事“正确”的方式是重命名这些类/属性以遵循约定:)(我已经看到太多人在生产代码中离开
RootObject