2013-11-28 51 views
1
public class Student 
{ 
    [JsonProperty("student_name")] 
    public string Name { get; set; } 
} 

我用[JsonProperty("student_name")]反序列化。第三部分JSON,之後Json.Net禁用JsonProperty時SerializeObject

我怎麼能得到{"Name":"test"}而不是{"student_name":"test"}當呼叫

string json = JsonConvert.SerializeObject(student); 

意味着如何programmly禁用JsonProperty?在2013年12月3日

UPDATE:

寫CustomContractResolver解決問題

public class JsonCustomContractResolver : DefaultContractResolver 
{ 

    protected override JsonProperty CreateProperty(MemberInfo member, 
     MemberSerialization memberSerialization) 
    { 
     var res = base.CreateProperty(member, memberSerialization); 

     var attrs = member 
      .GetCustomAttributes(typeof(JsonPropertyAttribute), true); 
     if (attrs.Any()) 
     { 

      if (res.PropertyName != null) 
      { 
       //UnderlyingName overwrite attribute name 
       res.PropertyName = res.UnderlyingName; 
      } 
     } 
     return res; 
    } 

} 

回答

1

您可以通過自定義JsonConverter定義實現這一目標。下面是一個示例代碼:

public class StudentConverter: JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(Student); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var jObject = JObject.Load(reader); 

     var target = new Student(); 

     serializer.Populate(jObject.CreateReader(), target); 

     return target; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var std = value as Student; 
     if (std == null) return; 

     writer.WriteStartObject(); 
     writer.WritePropertyName("Name"); 
     writer.WriteValue(std.Name); 
     writer.WriteEndObject(); 
    } 
} 

之後,您需要與StudentConverter來裝飾你的Student類:

[JsonConverter(typeof(StudentConverter))] 
public class Student 
{ 
    [JsonProperty("student_name")] 
    public string Name { get; set; } 
} 
+0

謝謝,這個想法是工作,但只爲「學生」的對象,不是一般的爲所有對象定製轉換器。 – tuanzhang

相關問題