Jakob
Jakob

Reputation: 1129

C# JsonConvert - List of Lists with Multiple Types

So I'm trying to parse a JSON request that looks a bit like this:

{
"source_code":"MOODY",
"code":"DAAAYLD",
"name":"Aaa Corporate Bond Yield",
"data":[
    [
        "2015-08-11",
        3.96
    ],
    [
        "2015-08-10",
        4.06
    ],
    [
        "2015-08-07",
        3.96
    ]
]
}

There's a few more items I've left out but they're not important. Now, I'm using

var jsonData = JsonConvert.DeserializeObject<JsonResponseObj>(GetRawData(code));

to make a JsonResponseObj which looks like:

public class JsonResponseObj
    {
        [JsonProperty("name")]
        public string name { get; set; }

        [JsonProperty("code")]
        public string code { get; set; }

        [JsonProperty("source_code")]
        public string source_code { get; set; }

        [JsonProperty("description")]
        public string description { get; set; }

        [JsonProperty("data")]
        public List<List<string>> data { get; set; }
    }

This works fine for getting the name, codes etc. if I omit the "data" property, however because the data itself is a list of lists (or list of two-tuples if you want to look at it that way) I'm not quite sure how the correct way of fetching this is. I've tried a few things which all seem to break the parser, including the most obvious one to me of:

[JsonProperty("data")]
public List<Tuple<string, float>> data { get; set; }

However that just gives an error of:

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'System.Tuple`2[System.String,System.Single]' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

But the actual type isn't a JSON object, as it has no Key/Value pairs, just 2 values for each type of "string, float".

Any clues on how this would be best parsed to get the data?

Upvotes: 3

Views: 7419

Answers (3)

{
  "source_code": "MOODY",
  "code": "DAAAYLD",
  "name": "Aaa Corporate Bond Yield",
  "data": [
    {
      "2015-08-11": 3.96
    },
    {
      "2015-08-11": 3.96
    },
    {
      "2015-08-11": 3.96
    }
  ]
}

I config syntax .json, like this, you will use List<Dictonary<string,float> data like u want

public class Root
{
    public string source_code { get; set; }
    public string code { get; set; }
    public string name { get; set; }
    public List<Dictionary<string,float>> data { get; set; }
}

Upvotes: 0

Jakob
Jakob

Reputation: 1129

Okay, so I've discovered dynamic types which do away with having a seperate static object for the JSON which didn't work with nested list strings.

Basically I solved it with one line of code:

dynamic jsonData = JsonConvert.DeserializeObject<dynamic>(rawJsonStr);

Which means I can then call on the top-level values directly, and use a JArray to iterate through the "data" list as below:

string name = jsonData.name;
string data_code = jsonData.code;
string source_code = jsonData.source_code;
JArray data = jsonData.data;
foreach (var point in data)
{
    System.Diagnostics.Debug.WriteLine(point[0] + " | " + point[1]);    
}

Upvotes: 3

Ibrahim Abdelkareem
Ibrahim Abdelkareem

Reputation: 957

The problem exists because of data it's not List>, because each entry contains string and double element so i've a quick solution for this issue just implement your class as the following.

public class JsonResponseObj { [JsonProperty("name")] public string name { get; set; }

    [JsonProperty("code")]
    public string code { get; set; }

    [JsonProperty("source_code")]
    public string source_code { get; set; }

    [JsonProperty("description")]
    public string description { get; set; }

    [JsonProperty("data")]
    public List<Dictionary<string,double>> data { get; set; }
}

Upvotes: 0

Related Questions