14

I have a block of JSON as follows:

[
  {
    "id": 1,
    "name": "Section1",
    "project_id": 100,
    "configs": [
      {
        "id": 1000,
        "name": "myItem1",
        "group_id": 1
      }
    ]
  },
  {
    "id": 2,
    "name": "Section2",
    "project_id": 100,
    "configs": [
      {
        "id": 1001,
        "name": "myItem2",
        "group_id": 2
      },
      {
        "id": 1002,
        "name": "myItem3",
        "group_id": 2
      },
      {
        "id": 1003,
        "name": "myItem4",
        "group_id": 2
      }
    ]
  },
  {
    "id": 3,
    "name": "Section3",
    "project_id": 100,
    "configs": [
      {
        "id": 1004,
        "name": "myItem5",
        "group_id": 5
      },
    ]
  }
]

I have pulled it into Memory as a JArray.

I need to iterate through this such that I'm grabbing a list of ids and name from only the config sub-arrays. Ideally, I'll end up with something like this:

1000, myItem1
1001, myItem2
1002, myItem3
1003, myItem4
1004, myItem5

I'm having a hard time understanding what Newstonsoft calls a JObject vs a JArray, or how to access the various parts of each of those data structures. What I have right now is as follows:

foreach (JObject config in result["configs"])
{
    string id = (string)config["id"];
    string name = (string)config["name"];
    string gid = (string)config["group_id"];

    Console.WriteLine(name + " - " + id + " - " + gid);
}

This does not work, but I hope it illustrates what my end goal is. I've been unable to piece together how to accomplish this goal.

2
  • Please provide a minimal reproducible example. What is result? Commented Nov 22, 2017 at 1:30
  • The easy way is to define some classes for the structure - use the help of jsonutils.com - and deserialize the json into the classes. Commented Nov 22, 2017 at 1:42

1 Answer 1

24

A JObject is an object (analogous to a class):

{
    "a": 1,
    "b": true
}

A JArray is a JSON array, and contains multiple JObject entities:

[
    {
        "a": 1,
        "b": true
    },
    {
        "a": 2,
        "b": true
    }
]

The root of a JSON document can be an object, or an array. In your case, it's an array.

The following code and fiddle reveals that your code is fine, provided that you deserialize the document as what it is - an array.

string json = "[{\"id\":1,\"name\":\"Section1\",\"project_id\":100,\"configs\":[{\"id\":1000,\"name\":\"myItem1\",\"group_id\":1}]},{\"id\":2,\"name\":\"Section2\",\"project_id\":100,\"configs\":[{\"id\":1001,\"name\":\"myItem2\",\"group_id\":2},{\"id\":1002,\"name\":\"myItem3\",\"group_id\":2},{\"id\":1003,\"name\":\"myItem4\",\"group_id\":2}]},{\"id\":3,\"name\":\"Section3\",\"project_id\":100,\"configs\":[{\"id\":1004,\"name\":\"myItem5\",\"group_id\":5},]}]";
JArray obj = Newtonsoft.Json.JsonConvert.DeserializeObject<JArray>(json);
foreach (var result in obj)
{
    foreach (JObject config in result["configs"])
    {
        string id = (string)config["id"];
        string name = (string)config["name"];
        string gid = (string)config["group_id"];

        Console.WriteLine(name + " - " + id + " - " + gid);
    }
}
Sign up to request clarification or add additional context in comments.

3 Comments

This has helped immensely to clear the confusion I had about the various object types -- I sincerely appreciate your time in typing this up!
A minor clarification: A JArray can contain things other than JObjects. Specifically there could be JValues if the JSON array contains strings or other non-object values. This is why the type of result above is the more generic JToken instead of JObject
very useful thank you, I've spent too much time to introduce myself better with Json

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.