1

I am new to JSON in general. I have a JSON file and I want to extract data from it, but I can't seem to find a way on how to do it. I've searched online, but I could not find any answer or I was just looking at the wrong places.

Here is my JSON data:

{"data":
    {"cars":
        {"total":117,
        "results":[
            {"id":"779579"},
            {"id":"952209"},
            {"id":"1103285"},
            {"id":"1157321"},
            {"id":"1372321"},
            {"id":"1533192"},
            {"id":"1630240"},
            {"id":"2061824"},
            {"id":"2312383"},
            {"id":"2353755"},
            {"id":"2796716"},
            {"id":"2811260"},
            {"id":"2824839"},
            {"id":"2961828"},
            {"id":"3315226"},
            {"id":"3586555"},
            {"id":"3668182"},
            {"id":"3986886"},
            {"id":"3989623"},
            {"id":"3998581"},
            {"id":"4021057"},
            {"id":"4038880"},
            {"id":"4308809"},
            {"id":"4325718"},
            {"id":"4352725"},
            {"id":"4360349"},
            {"id":"4628661"},
            {"id":"4863093"},
            {"id":"4940146"},
            {"id":"4947395"},
            {"id":"5157781"},
            {"id":"5794466"},
            {"id":"6134469"},
            {"id":"6157337"},
            {"id":"6307352"},
            {"id":"6727975"},
            {"id":"6783794"},
            {"id":"6831800"},
            {"id":"6960771"},
            {"id":"7159286"},
            {"id":"7211880"},
            {"id":"7212277"},
            {"id":"7217410"},
            {"id":"7264660"},
            {"id":"7406984"},
            {"id":"7893798"},
            {"id":"7948268"},
            {"id":"8047751"},
            {"id":"8271106"},
            {"id":"8346001"},
            {"id":"8352176"},
            {"id":"8485193"},
            {"id":"8746468"},
            {"id":"8801718"},
            {"id":"9104008"},
            {"id":"9494179"},
            {"id":"9588599"},
            {"id":"9717878"},
            {"id":"9845048"},
            {"id":"9891941"},
            {"id":"9943516"},
            {"id":"10002374"},
            {"id":"10213949"},
            {"id":"10326370"},
            {"id":"10499431"},
            {"id":"10518069"},
            {"id":"10538037"},
            {"id":"10589618"},
            {"id":"10602337"},
            {"id":"10723171"},
            {"id":"10724725"},
            {"id":"10746729"},
            {"id":"10751575"},
            {"id":"10752559"},
            {"id":"10852235"},
            {"id":"10867573"},
            {"id":"10877115"},
            {"id":"10893349"},
            {"id":"10988880"},
            {"id":"10993485"},
            {"id":"11026957"},
            {"id":"11111205"},
            {"id":"11122085"},
            {"id":"11150052"},
            {"id":"11251748"},
            {"id":"11259887"},
            {"id":"11270391"},
            {"id":"11291731"},
            {"id":"11303142"},
            {"id":"11303143"},
            {"id":"11308615"},
            {"id":"11313379"},
            {"id":"11334337"},
            {"id":"11338119"},
            {"id":"11338290"},
            {"id":"11339650"},
            {"id":"11347202"},
            {"id":"11359983"},
            {"id":"11390048"},
            {"id":"11399541"}]}}}

I want to extract all the id and put them in an array. I tried JToken, but it can only get 100 data (up to element [99]) only because anything beyond 99 would give me an error. I tried it using a for loop.

This is the error I get if go beyond 99:

ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
icebuken
  • 25
  • 6
  • What programming language are you using? – bhspencer Dec 02 '22 at 16:14
  • 1
    *I tried JToken but it can only get 100 data (up to element [99]) only because anything beyond 99 would give me an error.* -- then please [edit] your question to share a [mcve] showing the code that did not work. Are you sure that your `results` array has more than 99 items? – dbc Dec 02 '22 at 16:22
  • 1
    In the JSON shown there are only 100 ids, despite the fact that data.cars.total is 117. Looks like you should ignore the total value and just linq as shown here: `var ids = jtoken.SelectTokens("data.cars.results[*].id").Select(id => (int)id).ToList();`. See https://dotnetfiddle.net/MhY9s1. – dbc Dec 02 '22 at 16:28

1 Answers1

2

Your problem is that the value of data.cars.total is not what you think it is. In the JSON shown there are only 100 ids, despite the fact that data.cars.total equals 117. To put those 100 ids into an array, you may use SelectTokens() along with LINQ's ToArray() as follows:

var jtoken = JToken.Parse(jsonString); // Or load the JSON from a stream
var ids = jtoken.SelectTokens("data.cars.results[*].id").Select(id => (int)id).ToArray(); // Remove the .Select(id => (int)id) if you want them as strings

Console.WriteLine("{0} ids found:", ids.Length); // Prints 100
Console.WriteLine(string.Join(",", ids));        // Prints the deserialized ids

Where [*] is the JSONPath wildcard operator selecting all array elements.

Just a guess here, but possibly your JSON reflects a paged response in which data.cars.total is the total number of ids, not the number returned in the current page which was limited to 100.

Demo fiddle here.

dbc
  • 104,963
  • 20
  • 228
  • 340