【问题标题】:Json.Net deserialization, keeping some properties unserializedJson.Net 反序列化,保持一些属性未序列化
【发布时间】:2023-11-08 12:49:01
【问题描述】:

我有一个看起来像这样的 json 字符串:

{
    "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 值,而是存储原始字符串。 IE。我希望序列化后的Baz 字符串值为:

"[{\"Pressure\":9001,\"ServesDrinks\":true},{\"Pressure\":0,\"ServesDrinks\":false}]"

我正在使用 Json.Net,但还没有弄清楚如何做到这一点。 在理想情况下,我只想在我的 Baz 属性上添加一个魔术属性,以保留原始 json。

我在这里看到了一个非常相似的问题: Partially deserialize with JSON.NET, keeping some fields raw

但我确实了解如何使用 JObject 方法。

(如果有帮助,我知道我要保留的数据是一个列表)

感谢您的帮助!

【问题讨论】:

  • 另一个问题建议将Baz字段更改为JObject,这是表示JSON对象的通用类型。您可以使用Baz.ToString() 获取JSON 字符串,并使用JObject.parse(aJSONString) 分配给它。
  • 感谢 Jakub,但我无法让它工作。我得到一个 JsonReaderException :“读取字符串时出错。意外的令牌:StartArray。路径'Baz',第 1 行,位置 8。”
  • 你可以试试JArray。我看了一点 JSON.Net 文档,看起来JArray 用于处理 JS 数组,而JObject 仅适用于真正的 JS 对象({foo: ...})。我在下面给出了更全面的答案。
  • 谢谢!成功了!

标签: json parsing json.net json-deserialization


【解决方案1】:

根据另一个问题的答案,JSON.Net 中针对此类情况的解决方案似乎是使用适当的 J* 类型并使用他们的 ToString()Parse() 方法来处理 JSON字符串。

对于 JS 列表,合适的类型似乎是 JArray,而不是 JObject,它用于 {} 样式的 Javascript 对象。

请注意,我对 JSON.Net 知之甚少,也许有一个不同的解决方案可以避免在任何地方使用 Parse()ToString()。对该库有更深入了解的人可能会给出更好的答案。

【讨论】: