2015-12-30 78 views
0

爲了重用使用Newtonsoft Json.NET的現有代碼,我需要能夠將流的整個json內容反序列化爲「BadData」對象的單個屬性。將Json從流中反序列化爲字符串屬性

例子:

public class BadDataEntity 
{ 
    [Key] 
    public int ID { get; set; } 

    public string BadData { get; set; } 
} 

有沒有我可以添加到這個類屬性的組合,所以當我反序列化任何的Json不言而喻completley作爲一個字符串到BadData財產?

謝謝。

+3

換句話說,你根本不想反序列化JSON。如果是這樣的話,你不需要Json.NET。只需將該流的內容作爲字符串獲取並在該對象上設置該屬性即可。 –

+0

我有一個代碼將隊列中的消息反序列化爲實體並保存實體。如果可以,只使用配置,使用相同的進程指向死信隊列,使用不同的實體(BadRecords),並保留完整的Json而不必編寫單獨的服務,這將是理想的。 – wndproc

回答

0

如果因任何原因,你必須解析使用Json.NET(而不是簡單地讀取流轉換爲字符串,然後手動從它建設類),您可以創建加載JSON成JToken一個custom JsonConverter這個類然後存儲它的字符串值到你BadDataEntity類:

public class BadDataEntityConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(BadDataEntity).IsAssignableFrom(objectType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     // Note that BadData MUST BE VALID JSON, otherwise this won't work. 
     var token = JToken.Load(reader); 
     var bad = (existingValue as BadDataEntity ?? new BadDataEntity()); 
     bad.BadData = JsonConvert.SerializeObject(token, Formatting.Indented); 
     return bad; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var bad = (BadDataEntity)value; 
     if (bad.BadData == null) 
      writer.WriteNull(); 
     else 
     { 
      var token = JToken.Parse(bad.BadData); 
      token.WriteTo(writer, serializer.Converters.ToArray()); 
     } 
    } 
} 

注意,字符串必須包含有效的JSON。

然後您可以將轉換器連接到您的類像這樣:

[JsonConverter(typeof(BadDataEntityConverter))] 
public class BadDataEntity 
{ 
    [Key] 
    public int ID { get; set; } 

    public string BadData { get; set; } 
} 

或者把它的converters列表,如在documentationthis question所示。

相關問題