2013-06-26 145 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()。对该图书馆有更好的了解的人可能会给出更好的答案。