Skip to content

Instantly share code, notes, and snippets.

@nekitozzz
Created October 15, 2014 11:17
Show Gist options
  • Save nekitozzz/2d50cfb16c296ae0e419 to your computer and use it in GitHub Desktop.
Save nekitozzz/2d50cfb16c296ae0e419 to your computer and use it in GitHub Desktop.
Map json object to .Net model using JavaScriptConverter
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)}; }
}
}
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public class JsonPropertyAttribute : Attribute
{
public JsonPropertyAttribute(string name)
{
Name = name;
}
public string Name { get; set; }
}
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