2013-03-29 5 views
0

JavaScript를 deserialize로 가져와 처리중인 속성의 이름을 변경하려면 어떻게해야합니까? 예를 들어이름을 Deserialized 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); 

} 

감사합니다!

+0

- 당신은 아마도 그런 날짜를 전달하고 싶지 않을 것입니다. 다양한 날짜 형식의 현지화 문제가 있습니다. ISO8601'DateTime.ToString ("o")'과 같은 불변 포맷을 사용하고 자바 스크립트에서 [Moment.js] (http://momentjs.com/)와 쌍을 이뤄라. –

+0

확실한 것 - 나는 단지 빠른 예를 들고 싶었습니다. – elucid8

답변

3

JavaScriptSerializer에서는 쉽게 처리 할 수없는 것처럼 보이지만 Json.Net 또는 DataContractSerializer (.NET 프레임 워크의 일부)를 사용하면 쉽게 처리 할 수 ​​있습니다.

Json.Net의 경우 JsonProperty 특성에 이름을 지정할 수 있습니다.

class MyClass 
{ 
    [JsonProperty(Name="create_date")] 
    public string CreateDate {get;set;} 
} 

그리고 DataContractSerializer 사용 DataMember 속성

+0

이것은 Microsoft 어셈블리에 있습니까? – elucid8

+0

@ elucid8 http://json.codeplex.com/ –

0

당신은 아주 쉽게 당신의 자신의 추가 할 수 있지만 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;} 
} 

나는 조금 늦었을지 모르지만 다른 사람들이 Json.Net이 아닌 JavaScriptSerializer 또는 'DataContractJsonSerializer`를 사용해도 좋을 것이라고 생각했습니다.