2017-08-11 108 views
1

我有一個JSON消息用一個包含另一個對象的JSON的字符串屬性進行反序列化。我有以下類JSON.NET反序列化存儲爲屬性的JSON對象

public class Envelope 
{ 
    public string Type { get; set; } 
    public Message InnerMessage { get; set; } 
} 

public class Message 
{ 
    public string From { get; set; } 
    public string To { get; set; } 
    public string Body { get; set; } 
} 

我收到JSON消息的格式如下:

{ 
    Type : "send", 
    InnerMessage : "{ From: \"sender\", To: \"receiver\", Body: \"test\" }" 
} 

注意InnerMessage包含Message類,類的不是JSON的序列化。

如果我將InnerMessage屬性的類型保留爲Message,則標準JSON.NET反序列化失敗。

如果我改變InnerMessagestring,系列化的作品,但之後我需要的InnerMessage內容再次反序列化到Message類:

Envelope envelope = JsonConvert.DeserializeObject<Envelope>(jsonMessage); 
Message innerMessage = JsonConvert.DeserializeObject<Envelope>(envelope.InnerMessage); 

有一些辦法的EnvelopeInnerMessage屬性保持到Message並告訴JSON.NET將字符串值自動處理爲反序列化?

+0

你是如何序列化的對象?當我使用'JsonConvert.SerializeObject(envelope)'時,我得到了不同的Json輸出。 –

+0

我從web服務獲取JSON,我只需要將其反序列化到我創建的類 –

+0

難題,看起來像@SirRufo有答案您尋找 –

回答

2

你需要一個定製JsonConverter

class StringTypeConverter : Newtonsoft.Json.JsonConverter 
{ 
    public override bool CanRead => true; 
    public override bool CanWrite => true; 

    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     string json = (string)reader.Value; 
     var result = JsonConvert.DeserializeObject(json, objectType); 
     return result; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var json = JsonConvert.SerializeObject(value); 
     serializer.Serialize(writer, json); 
    } 
} 

,並添加JsonConverterAttributeInnerMessage財產

public class Envelope 
{ 
    public string Type { get; set; } 
    [Newtonsoft.Json.JsonConverter(typeof(StringTypeConverter))] 
    public Message InnerMessage { get; set; } 
} 

public class Message 
{ 
    public string From { get; set; } 
    public string To { get; set; } 
    public string Body { get; set; } 
} 

現在你可以序列化/反序列化Envelope

var envelope = JsonConvert.DeserializeObject<Envelope>(jsonMessage); 
+0

謝謝,您的解決方案看起來比另一個更清潔,明天我會測試它 –

+0

您的解決方案完美工作,再次感謝 –

2

您可以使用自定義轉換器完成此操作。例如:

​​

而且使用這樣的:

Envelope envelope = JsonConvert.DeserializeObject<Envelope>(
    jsonMessage, new EnvelopeConverter()); 
+0

感謝您的答案,但我個人更喜歡Rufo爵士作爲我的答案可以申請到具體屬性而不是類 –