2016-09-20 45 views
3

這裏的原始JSON數據的例子:反序列化JSON對象作爲.NET HashSet的

{ "Standards": { "1": "1" } } 

我希望將數據反序列化:

public class Model 
{ 
    public HashSet<String> Standards { get; set; } 
} 

Standards場卻有Dictionary<String, String>類型。不知何故,鍵和值總是相等的。由於類型不兼容,我正在尋找一種方法來執行此字段的自定義反序列化。

首選基於JSON.NET庫的解決方案。

P.S .:我無法控制數據序列化過程。

+0

你總是可以編寫你自己的'JsonConverter'並用'JsonConverterAttribute'標記屬性,如果需要的功能已經不存在的話。 – kiziu

+0

JsonConvert.DeserializeObject (json);你是這樣試試嗎? –

回答

5

您可以使用自定義JsonConverter來處理此問題。下面是你需要的代碼:

public class CustomHashSetConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(HashSet<string>); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JObject jo = JObject.Load(reader); 
     return new HashSet<string>(jo.Properties().Select(p => p.Name)); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     HashSet<string> hashSet = (HashSet<string>)value; 
     JObject jo = new JObject(hashSet.Select(s => new JProperty(s, s))); 
     jo.WriteTo(writer); 
    } 
} 

要使用轉換器,[JsonConverter]屬性添加到您的模型是這樣的:

public class Model 
{ 
    [JsonConverter(typeof(CustomHashSetConverter))] 
    public HashSet<string> Standards { get; set; } 
} 

然後,就反序列化正常,它應該工作:

Model model = JsonConvert.DeserializeObject<Model>(json); 

這是一個往返演示:https://dotnetfiddle.net/tvHt5Y

+1

如果名稱和值不匹配,您可能希望'ReadJson'引發異常。以防萬一您獲得的價值不具備相同的關鍵和價值。 –

+0

工程就像一個魅力。謝謝。 – shadeglare

+0

沒問題。很高興我能幫上忙。 –