48

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.

Patrick M
  • 10,547
  • 9
  • 68
  • 101
TaLha Khan
  • 2,413
  • 2
  • 25
  • 39

3 Answers3

66

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);
L.B
  • 114,136
  • 19
  • 178
  • 224
  • thanks a ton..worked like a charm......problem solved. but still i dont know how it worked. can you please explain how dictionary worked ? – TaLha Khan Jul 02 '14 at 16:42
  • 5
    @TaLhaKhan Because your json represents key-value pairs. "1" is the key, `{...}` is the value. – L.B Jul 02 '14 at 16:44
49

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; }
}
ken2k
  • 48,145
  • 10
  • 116
  • 176
  • 5
    Of course, if the number of *Keys* and their names are known beforehand. Not suitable for dynamically created objects like `userid : {name:aa,surname:bb}, anotheruserid:{}` – I4V Jul 03 '14 at 11:55
  • @I4V If they are dynamically created objects you probably couldn't use predefined classes anyway. – Roman Jul 07 '14 at 17:58
  • 1
    @R0MANARMY I didn't mean it . Keys can be dynamic, for example a guid or an id comming from db. But its value is a known type. `{{1232574:{name:john}, 755344674:{name:doe}}` – I4V Jul 07 '14 at 18:14
0

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);
    }
}