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
Post a Comment