2014-09-10 37 views
1

的陣列我有一個類的Web API - JSON序列化屬性字符串

public class Person 
    { 
     public string Name { get; set; } 
     public string LastName { get; set; } 
     public int Age { get; set; } 
    } 

我想它序列化到:

{ 「人」:「[約翰·史密斯, 13] 「}

,而不是

{ 」名稱「:」 約翰「,」姓氏「:」史密斯「,」年齡「:13}

是否有可能實現這一點,而無需編寫自定義序列化程序?如果不是,我如何才能將自定義序列化器僅應用於特定的類?

+2

您可以嘗試{「Person」:[「John」,「Smith」,13]}。 – 2014-09-10 12:34:55

回答

4

由於在序列化Person實例時想要獲得的json字符串不是標準字符串,所以您需要編寫一個自定義轉換器並用它來裝飾您的類。一種方法是如下。寫類繼承JsonConverter

public class CustomConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     if (value == null) return; 

     writer.WriteStartObject(); 
     writer.WritePropertyName(value.GetType().Name); 

     writer.WriteStartArray(); 

     var properties = value.GetType().GetProperties(); 

     foreach (var property in properties) 
      writer.WriteValue(value.GetType().GetProperty(property.Name).GetValue(value)); 

     writer.WriteEndArray(); 
     writer.WriteEndObject(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof (Person); 
    } 
} 

裝飾類與JsonConverter屬性:

[JsonConverter(typeof(CustomConverter))] 
public class Person 
{ 
    public string Name { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
} 

現在讓我們說,你使用下面的代碼:

var person = new Person 
{ 
    Name = "John", 
    LastName = "Smith", 
    Age = 13 
}; 

var json = JsonConvert.SerializeObject(person, Formatting.Indented); 

json varible WIL有這個值:

{ 
    "Person": [ 
     "John", 
     "Smith", 
     13 
    ] 
} 

演示here

+0

非常感謝,這個作品很棒! – BornToCode 2014-09-11 15:07:39

相關問題