2013-07-29 63 views
2

我有下面的類定義:Json的轉換,其繼承的對象字典

public class ElasticObject : Dictionary<string, object> 
{ 
    public int Id { get;set;} 
} 

var keyValues = new ElasticObject(); 
keyValues.Id= 200000; 
keyValues.Add("Price", 12.5); 
var json = JsonConvert.SerializeObject(keyValues, 
      new JsonSerializerSettings{NullValueHandling = NullValueHandling.Ignore}); 

被解析JSON字符串{「價格」:12.5}這不包含Id屬性,有沒有什麼辦法可以自定義JSON轉換?

回答

2

您可以通過定製JsonConverter類來實現此目的。也許是這樣的:

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

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     ElasticObject eobj = (ElasticObject)value; 
     var temp = new Dictionary<string, object>(eobj); 
     temp.Add("Id", eobj.Id); 
     serializer.Serialize(writer, temp); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var temp = serializer.Deserialize<Dictionary<string, object>>(reader); 
     ElasticObject eobj = new ElasticObject(); 
     foreach (string key in temp.Keys) 
     { 
      if (key == "Id") 
       eobj.Id = Convert.ToInt32(temp[key]); 
      else 
       eobj.Add(key, temp[key]); 
     } 
     return eobj; 
    } 
} 

你會再使用這樣的:

var settings = new JsonSerializerSettings 
{ 
    NullValueHandling = NullValueHandling.Ignore, 
    Converters = new List<JsonConverter> { new ElasticObjectConverter() } 
}; 

var keyValues = new ElasticObject(); 
keyValues.Id = 200000; 
keyValues.Add("Price", 12.5); 

var json = JsonConvert.SerializeObject(keyValues, settings); 

的JSON通過上文中所製造是這樣的:

{"Price":12.5,"Id":200000} 

這是你是什麼尋找?

0

我做了額外的屬性只是將數據返回到基本字典中。這樣,你得到暴露,如「標識」,但序列化/反序列化過程中一個屬性它只會與底層字典工作:

public class ElasticObject : Dictionary<string, object> 
{ 
    public int Id 
    { 
     get { 
      int val; 
      if (int.TryParse(this["Id"] as string, out val)) 
      { 
       return val; 
      } 

      return -1; 
     } 
     set { this["Id"] = value; } 
    } 
} 
+0

請注意:因爲JSON.NET會[繞過你的制定者和直接設置「基礎」字典](http://www.newtonsoft.com/json/help/html/SerializationGuide.htm#Dictionarys)它不會'強類型'的值,所以如果你的任何屬性是類,最終會成爲'JArrays'或'JObject'。正如你已經指出的那樣,你基本上必須在每個吸氣器中「反序列化」它,這並不理想。 – drzaus