c# - Deserialize the JSON where the values are field names with JSON.NET -


i have undesirable situation requires me deserialize json values field names json.net. assuming have following json structured:

{     "name": "tugberk",     "roles": [         { "id": "1", "name": "admin" },         { "id": "2", "name": "guest" }     ] } 

it's easy deserialize json.net clr object:

class program {     static void main(string[] args)     {         var camelcasesettings = new jsonserializersettings { contractresolver = new camelcasepropertynamescontractresolver() };          var text = file.readalltext("user_normal.txt");         var obj = jsonconvert.deserializeobject<user>(text, camelcasesettings);     } }  public class user {     public string name { get; set; }     public role[] roles { get; set; } }  public class role {     public int id { get; set; }     public string name { get; set; } } 

however, in current case, have following horrible json equivalent above json in terms of values:

{     "name": "tugberk",     "roles": {         "1": { "name": "admin" },         "2": { "name": "guest" }     } } 

as can see, roles field not array; it's object contains other values objects it's unique keys field names (which horrible). what's best way deserialize json above user class json.net?

you can create custom jsonconverter serializes/deserializes role[]. can decorate roles property jsonconverterattribute this:

public class user {     public string name { get; set; }     [jsonconverter(typeof(rolesconverter))]     public role[] roles { get; set; } } 

in converter class able read object , return array instead. converter class may this:

class rolesconverter : jsonconverter {     public override bool canconvert(type objecttype)     {         return objecttype == typeof(role[]);     }      public override object readjson(jsonreader reader, type objecttype, object existingvalue, jsonserializer serializer)     {         // deserialize object         var roles = serializer.deserialize<jobject>(reader);         var result = new list<role>();          // create array out of properties         foreach (jproperty property in roles.properties())         {             var role = property.value.toobject<role>();             role.id = int.parse(property.name);             result.add(role);         }          return result.toarray();     }       public override void writejson(jsonwriter writer, object value, jsonserializer serializer)     {         throw new notimplementedexception();     } } 

Comments