Rename Property From Deserialized Javascript
How do I take deserialize JavaScript and change the name of the property being processed? For example: class MyClass { public string CreateDate {get;set;} } public class Deseriali
Solution 1:
Looks like you can't do it easily for JavaScriptSerializer, but you can do that in Json.Net or using DataContractSerializer (part of .Net framework).
For Json.Net you can put JsonProperty attribute that specifies a name.
classMyClass
{
[JsonProperty(Name="create_date")]
publicstring CreateDate {get;set;}
}
And for DataContractSerializer use DataMember
attribute
Solution 2:
There is no standard support for renaming properties in JavaScriptSerializer
however you can quite easily add your own:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;
using System.Reflection;
publicclassJsonConverter : JavaScriptConverter
{
publicoverrideobjectDeserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
List<MemberInfo> members = new List<MemberInfo>();
members.AddRange(type.GetFields());
members.AddRange(type.GetProperties().Where(p => p.CanRead && p.CanWrite && p.GetIndexParameters().Length == 0));
object obj = Activator.CreateInstance(type);
foreach (MemberInfo member in members)
{
JsonPropertyAttribute jsonProperty = (JsonPropertyAttribute)Attribute.GetCustomAttribute(member, typeof(JsonPropertyAttribute));
if (jsonProperty != null && dictionary.ContainsKey(jsonProperty.Name))
{
SetMemberValue(serializer, member, obj, dictionary[jsonProperty.Name]);
}
elseif (dictionary.ContainsKey(member.Name))
{
SetMemberValue(serializer, member, obj, dictionary[member.Name]);
}
else
{
KeyValuePair<string, object> 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;
}
privatevoidSetMemberValue(JavaScriptSerializer serializer, MemberInfo member, object obj, objectvalue)
{
if (member is PropertyInfo)
{
PropertyInfo property = (PropertyInfo)member;
property.SetValue(obj, serializer.ConvertToType(value, property.PropertyType), null);
}
elseif (member is FieldInfo)
{
FieldInfo field = (FieldInfo)member;
field.SetValue(obj, serializer.ConvertToType(value, field.FieldType));
}
}
publicoverride IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
Type type = obj.GetType();
List<MemberInfo> members = new List<MemberInfo>();
members.AddRange(type.GetFields());
members.AddRange(type.GetProperties().Where(p => p.CanRead && p.CanWrite && p.GetIndexParameters().Length == 0));
Dictionary<string, object> values = new Dictionary<string, object>();
foreach (MemberInfo member in members)
{
JsonPropertyAttribute 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;
}
privateobjectGetMemberValue(MemberInfo member, object obj)
{
if (member is PropertyInfo)
{
PropertyInfo property = (PropertyInfo)member;
return property.GetValue(obj, null);
}
elseif (member is FieldInfo)
{
FieldInfo field = (FieldInfo)member;
return field.GetValue(obj);
}
returnnull;
}
publicoverride IEnumerable<Type> SupportedTypes
{
get
{
returnnew[] { typeof(MyClass) };
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
publicclassJsonPropertyAttribute : Attribute
{
publicJsonPropertyAttribute(string name)
{
Name = name;
}
publicstring Name
{
get;
set;
}
}
The MyClass
class then becomes:
classMyClass
{
[JsonProperty("create_date")]
publicstring CreateDate {get;set;}
}
I appreicate this might be a little late but thought other people wanting to use the JavaScriptSerializer
rather than the Json.Net
or 'DataContractJsonSerializer` might appreciate it.
Post a Comment for "Rename Property From Deserialized Javascript"