从反序列化Javascript中重命名属性
Rename Property from Deserialized Javascript
如何反序列化JavaScript并更改正在处理的属性的名称?
例如:class MyClass
{
public string CreateDate {get;set;}
}
public class DeserializeMyClass
{
//How do I take "create_date" and convert it to CreateDate? Is there an attribute I
//can use?
var json = @"{""create_date"":""04/12/2013""}";
var ds = new JavaScriptSerializer();
ds.Deserialize<MyClass>(json);
}
提前感谢!
看起来你不能为JavaScriptSerializer轻松做到这一点,但你可以在Json中做到这一点。Net或使用DataContractSerializer (.Net框架的一部分)。
为Json。Net中,你可以把JsonProperty属性指定一个名称。
class MyClass
{
[JsonProperty(Name="create_date")]
public string CreateDate {get;set;}
}
对于DataContractSerializer使用DataMember
属性
在JavaScriptSerializer
中没有重命名属性的标准支持,但是您可以很容易地添加自己的属性:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;
using System.Reflection;
public class JsonConverter : JavaScriptConverter
{
public override object Deserialize(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]);
}
else if (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;
}
private void SetMemberValue(JavaScriptSerializer serializer, MemberInfo member, object obj, object value)
{
if (member is PropertyInfo)
{
PropertyInfo property = (PropertyInfo)member;
property.SetValue(obj, serializer.ConvertToType(value, property.PropertyType), null);
}
else if (member is FieldInfo)
{
FieldInfo field = (FieldInfo)member;
field.SetValue(obj, serializer.ConvertToType(value, field.FieldType));
}
}
public override 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;
}
private object GetMemberValue(MemberInfo member, object obj)
{
if (member is PropertyInfo)
{
PropertyInfo property = (PropertyInfo)member;
return property.GetValue(obj, null);
}
else if (member is FieldInfo)
{
FieldInfo field = (FieldInfo)member;
return field.GetValue(obj);
}
return null;
}
public override IEnumerable<Type> SupportedTypes
{
get
{
return new[] { typeof(MyClass) };
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public class JsonPropertyAttribute : Attribute
{
public JsonPropertyAttribute(string name)
{
Name = name;
}
public string Name
{
get;
set;
}
}
则MyClass
类变为:
class MyClass
{
[JsonProperty("create_date")]
public string CreateDate {get;set;}
}
我欣赏这可能有点晚,但认为其他想要使用JavaScriptSerializer
而不是Json.Net
或'DataContractJsonSerializer '的人可能会欣赏它。
相关文章:
- 正在使用Dropzone.js删除服务器上已重命名的文件
- Angular重命名模块后未能实例化模块
- 如何使用laravel重命名已存储在服务器中的文件
- 如何使用外部Javascript库(如jQuery)重命名Google闭包样式表
- 为什么 Google 闭包编译器会重命名对象的属性名称
- 谷歌闭包编译器,某些属性永远不会被重命名
- 挖空.js当视图模型的属性重命名时,绑定会断开
- 对象不支持属性或方法“子项” 在 JStree 中重命名节点时
- 重命名属性名称并更改多个对象的值
- 对象属性重命名
- 闭包编译器未重命名属性和方法(高级编译)
- 防止闭包编译器在不使用括号表示法的情况下重命名属性
- 闭包编译器为什么要重命名外部类型的属性
- 我可以告诉闭包编译器,仅对特定类型停止重命名属性吗?
- 如何解决在闭包编译器中重命名对象属性的问题
- 在Javascript中,我如何重命名/重新编号一组属性
- 从反序列化Javascript中重命名属性
- 用javascript / jquery重命名class属性的前面
- 如何在环回框架中重写和重命名用户内置模型的属性
- 为什么闭包编译器用google . exportsymbol重命名属性