首页 > 解决方案 > Json.NET 将不匹配的数据反序列化为扩展数据

问题描述

我正在尝试将 json 反序列化为一个对象。一个属性的情况下,我有一个带有$ref属性的子对象(最终将被解析为字符串)......但在反序列化时,我希望将这些属性添加到我的 JsonExtensionData (其中存在数据类型不匹配) .

考虑以下:

    internal class Program
    {
        private static void Main()
        {
            var json = File.ReadAllText("test.json");
            var jo = JObject.Parse(json);
            using var reader = jo.CreateReader();
            var serializer = JsonSerializer.CreateDefault();
            var o = new JsonData();
            serializer.Populate(reader, o);
        }
    }

    public class JsonData
    {
        public JsonChildData Data { get; set; }
        
        [JsonExtensionData]
        public IDictionary<string, object> AdditionalData { get; set; }
    }

    public class JsonChildData
    {
        public int IntValue { get; set; }

        public string StringValue { get; set; }

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

使用包含以下内容的 test.json 文件:

{
  "data": {
    "intValue": 1,
    "otherValue": "baz",
    "stringValue": {
      "$ref": "foobar"
    }
  }
}

请注意,stringValue 实际上是一个“$ref”对象,因此StringStringValue.

在这种情况下,我想stringValue在我的JsonExtensionData字典中结束JsonChildData.

作为假设,如果我AdditionalData手动将字符串值添加到我的 test.json 中并stringValue从我的 test.json 中删除,那么在序列化数据时会遇到一个额外的问题。

o.Data.AdditionalData["stringValue"] = new JObject
  {
    ["$ref"] = "foobar"
  };
var newJson = JsonConvert.SerializeObject(o);

newJson现在包含重复的属性名称(我希望排除 null 并包含自定义值JsonExtensionData):

{
  "data": {
    "intValue": 1,
    "stringValue": null,
    "otherValue": "baz",
    "stringValue": {
      "$ref": "foobar"
    }
  }
}

关于如何使用转换器或自定义合同解析器在此处获得所需输出的任何建议?请注意,硬编码的每个属性方法将不起作用。我需要一种动态处理这些 $ref 情况的方法。

谢谢!

标签: json.netjson.net

解决方案


推荐阅读