【问题标题】:Deserialize known and unknown JSON fields into a CLR object with JSON.NET使用 JSON.NET 将已知和未知的 JSON 字段反序列化为 CLR 对象
【发布时间】:2014-06-12 09:15:49
【问题描述】:

我有以下 JSON 负载:

{
    "id": 1,
    "foo": "bar",
    "bar": "foo",
    "attr_1": ["foo", "bar"],
    "attr_2": ["foo2", "bar2"]
}

我还有以下 CLR 对象:

public class Obj
{
    public int Id { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }

    [JsonExtensionData]
    public IDictionary<string, string[]> Properties { get; set; }
}

如果我尝试反序列化它,它会失败:

using (FileStream file = File.Open(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "file.txt"), FileMode.Open))
using (StreamReader reader = new StreamReader(file))
{
    Obj foo = JsonConvert.DeserializeObject<Obj>(reader.ReadToEnd());
}

There is already an answer to a similar question。但是,一个一个地读写每个字段并不是一个解决方案。我将剩余字段反序列化为IDictionary&lt;string, string[]&gt; 的最佳方法是什么?

【问题讨论】:

    标签: c# .net json json.net


    【解决方案1】:

    This line 在 Json.NET 源代码中强制值类型为 JToken。我认为最简单的方法是为序列化创建另一种类型。

    public class SerializationModel
    {
        public int Id { get; set; }
        public string Foo { get; set; }
        public string Bar { get; set; }
    
        [JsonExtensionData]
        public IDictionary<string, JToken> Properties { get; set; }
    }
    
    class Model
    {
        public int Id { get; set; }
        public string Foo { get; set; }
        public string Bar { get; set; }
        public Dictionary<string, string[]> Properties { get; set; }
    }
    
    [Test]
    public void DeserializeTest()
    {
        string data = File.ReadAllText("data.txt");
        SerializationModel serializationModel = JsonConvert.DeserializeObject<SerializationModel>(data);
    
        Model model = new Model
        {
            Id = serializationModel.Id,
            Foo = serializationModel.Foo,
            Bar = serializationModel.Bar,
            Properties = serializationModel.Properties.ToDictionary(item => item.Key, pair => pair.Value.ToObject<string[]>())
        };
    
    }
    

    【讨论】:

    • 谢谢!这当然是一个解决方案,但不像我想要的那样天真:s 我会尝试看看我是否可以扩展或重新实现 JsonExtensionData
    • @tugberk 我只是想从 JsonElement 请求正文中创建一个普通的 CLR 对象,但是在反序列化之后,运行时中的类型仍然是 JsonElement
    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多