Created
October 15, 2014 11:17
-
-
Save nekitozzz/2d50cfb16c296ae0e419 to your computer and use it in GitHub Desktop.
Map json object to .Net model using JavaScriptConverter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class InvoiceModelJavaScriptConverter : JavaScriptConverter | |
{ | |
public override object Deserialize(IDictionary<string, object> dictionary, Type type, | |
JavaScriptSerializer serializer) | |
{ | |
var members = new List<MemberInfo>(); | |
members.AddRange(type.GetFields()); | |
members.AddRange( | |
type.GetProperties().Where(p => p.CanRead && p.CanWrite && p.GetIndexParameters().Length == 0)); | |
var obj = Activator.CreateInstance(type); | |
foreach (var member in members) | |
{ | |
var jsonProperty = | |
(JsonPropertyAttribute) Attribute.GetCustomAttribute(member, typeof (JsonPropertyAttribute)); | |
if (jsonProperty != null && dictionary.ContainsKey(jsonProperty.Name)) | |
{ | |
SetMemberValue(serializer, member, obj, dictionary[jsonProperty.Name]); | |
} | |
else if (dictionary.ContainsKey(member.Name)) | |
{ | |
SetMemberValue(serializer, member, obj, dictionary[member.Name]); | |
} | |
else | |
{ | |
var kvp = | |
dictionary.FirstOrDefault( | |
x => string.Equals(x.Key, member.Name, StringComparison.InvariantCultureIgnoreCase)); | |
if (!kvp.Equals(default(KeyValuePair<string, object>))) | |
SetMemberValue(serializer, member, obj, kvp.Value); | |
} | |
} | |
return obj; | |
} | |
private void SetMemberValue(JavaScriptSerializer serializer, MemberInfo member, object obj, object value) | |
{ | |
if (member is PropertyInfo) | |
{ | |
var property = (PropertyInfo) member; | |
property.SetValue(obj, serializer.ConvertToType(value, property.PropertyType), null); | |
} | |
else if (member is FieldInfo) | |
{ | |
var field = (FieldInfo) member; | |
field.SetValue(obj, serializer.ConvertToType(value, field.FieldType)); | |
} | |
} | |
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) | |
{ | |
var type = obj.GetType(); | |
var members = new List<MemberInfo>(); | |
members.AddRange(type.GetFields()); | |
members.AddRange( | |
type.GetProperties().Where(p => p.CanRead && p.CanWrite && p.GetIndexParameters().Length == 0)); | |
var values = new Dictionary<string, object>(); | |
foreach (var member in members) | |
{ | |
var jsonProperty = | |
(JsonPropertyAttribute) Attribute.GetCustomAttribute(member, typeof (JsonPropertyAttribute)); | |
if (jsonProperty != null) | |
values[jsonProperty.Name] = GetMemberValue(member, obj); | |
else | |
values[member.Name] = GetMemberValue(member, obj); | |
} | |
return values; | |
} | |
private object GetMemberValue(MemberInfo member, object obj) | |
{ | |
if (member is PropertyInfo) | |
{ | |
var property = (PropertyInfo) member; | |
return property.GetValue(obj, null); | |
} | |
if (member is FieldInfo) | |
{ | |
var field = (FieldInfo) member; | |
return field.GetValue(obj); | |
} | |
return null; | |
} | |
public override IEnumerable<Type> SupportedTypes | |
{ | |
//Here we must define supported types | |
get { return new[] {typeof (SomeModel)}; } | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] | |
public class JsonPropertyAttribute : Attribute | |
{ | |
public JsonPropertyAttribute(string name) | |
{ | |
Name = name; | |
} | |
public string Name { get; set; } | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public override SomeModel MapFromJson(string json) | |
{ | |
var jss = new JavaScriptSerializer(); | |
jss.RegisterConverters(new[] { new InvoiceModelJavaScriptConverter() }); | |
var foo = jss.Deserialize<SomeModel>(json); | |
return Foo | |
} | |
... | |
public class DataObject | |
{ | |
[JsonProperty("user_id")] | |
public int UserId { get; set; } | |
[JsonProperty("detail_level")] | |
public DetailLevel DetailLevel { get; set; } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment