How can I parse a JSON string that would cause illegal C# identifiers?How can I parse a JSON string that would cause illegal C# identifiers? - Solution Checker - solutionschecker.com - Find the solution for any programming question. We as a solution checker will focus on finding the fastest possible solution for developers. Main topics like coding, learning.

I have been using NewtonSoft JSON Convert library to parse and convert JSON string to C# objects. But now I have came across a really awkward JSON string and I am unable to convert it into C# object because I cant make a C# class out of this JSON string.

Here is the JSON string

{
"1": {
    "fajr": "04:15",
    "sunrise": "05:42",
    "zuhr": "12:30",
    "asr": "15:53",
    "maghrib": "19:18",
    "isha": "20:40"
},
"2": {
    "fajr": "04:15",
    "sunrise": "05:42",
    "zuhr": "12:30",
    "asr": "15:53",
    "maghrib": "19:18",
    "isha": "20:41"
 } 
}

The C# class required to parse this JSON string should be like this:

public class 1 {

    public string fajr { get; set; }
    public string sunrise { get; set; }
    public string zuhr { get; set; }
    public string asr { get; set; }
    public string maghrib { get; set; }
    public string isha { get; set; }
}

public class 2 {

    public string fajr { get; set; }
    public string sunrise { get; set; }
    public string zuhr { get; set; }
    public string asr { get; set; }
    public string maghrib { get; set; }
    public string isha { get; set; }
}

But it cant be a true C# class because we know that Class names cannot start with a number.

It will be really great if anyone can suggest how to parse such type of json string.

Solution 1

You can deserialize to a dictionary.

public class Item
{
    public string fajr { get; set; }
    public string sunrise { get; set; }
    public string zuhr { get; set; }
    public string asr { get; set; }
    public string maghrib { get; set; }
    public string isha { get; set; }
}

var dict = JsonConvert.DeserializeObject<Dictionary<string, Item>>(json);

Solution 2

While the dictionary is the best solution for the specific case you had, the question you asked could also be interpreted as:

how do I deserialize objects with property names that cannot be used in C#?

For example what if you had

{
    "0": "04:15",
    "zzz": "foo"
}

Solution: use annotations:

public class Item
{
   [JsonProperty("0")]
   public string AnyName { get; set; }

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

Solution 3

You can use this extensions:

public static class JsonExtensions
{
    public static Dictionary<string, T> ToObject<T>(this string json)
    {
        return JsonConvert.DeserializeObject<Dictionary<string, T>>(json);
    }

    public static string ToJson<T>(this T obj)
    {
        return JsonConvert.SerializeObject(obj);
    }
}