2013-06-26 199 views
3

我有一個JSON字符串看起來像這樣:Json.Net反序列化,保留一些屬性序列化的

{ 
    "Bar": { 
     "Pressure":42, 
     "ServesDrinks":false 
    }, 
    "Baz":[ 
     { 
      "Pressure":9001, 
      "ServesDrinks":true 
     }, 
     { 
      "Pressure":0, 
      "ServesDrinks":false 
     } 
    ] 
} 

而且我想這個反序列化到一個類看起來像這樣:

public class Foo 
{ 
    public Bar Bar { get; set; } 

    /// <summary> 
    /// Raw serialized (un-de-serialized) json string of the Baz list 
    /// </summary> 
    public string Baz { get; set; } 
} 

基本上不反序列化Baz值,而是存儲原始字符串。 也就是說我想序列化後的Baz字符串值是:

「[{\」 壓力\ 「:9001,\」 ServesDrinks \ 「:真正},{\」 壓力\ 「:0,\」 ServesDrinks \ 「:false}]」

我正在使用Json.Net,但還沒有設法弄清楚如何做到這一點。 在理想情況下,我只想在保留原始JSON的Baz屬性上放置一個魔術屬性。

我看到這裏非常類似的問題: Partially deserialize with JSON.NET, keeping some fields raw

但我知道如何與JObject辦法去。

(如果它的任何幫助,我知道我要保留的數據列表)

感謝任何幫助!

+2

另一個問題建議將Baz字段更改爲'JObject',它是表示JSON對象的泛型類型。您可以使用'Baz.ToString()'獲得JSON字符串,並使用'JObject.parse(aJSONString)'分配給它。 –

+0

謝謝Jakub,但是我無法做到這一點。我得到一個JsonReaderException:「錯誤讀取字符串。意外的標記:StartArray。路徑'Baz',第1行,位置8。 –

+0

您可以嘗試使用'JArray'。我看了一下JSON.Net文檔,看起來'JArray'用於處理JS數組,'JObject'只能用於真正的JS對象('{foo:...}')。下面給出了一個更完整的答案。 –

回答

2

根據對其他問題的回答,似乎JSON.Net中的解決方案是使用適當的J*類型並使用它們的ToString()Parse()方法來處理JSON字符串。

對於JS列表,適當的類型似乎是JArray,而不是JObject,它用於{}樣式的Javascript對象。

請注意,我對JSON.Net知之甚少,也許有一種不同的解決方案可以避免在任何地方都需要使用Parse()ToString()。對該圖書館有更好的瞭解的人可能會給出更好的答案。