使用已知和未知字段反序列化json

nic*_*ane 57 c# json json.net

给出以下json结果:默认的json结果有一组已知的字段:

{
    "id": "7908",
    "name": "product name"
}
Run Code Online (Sandbox Code Playgroud)

但可以用额外的字段(在此示例中被扩展_unknown_field_name_1_unknown_field_name_2其中的请求结果,当名称不知道).

{
    "id": "7908",
    "name": "product name",
    "_unknown_field_name_1": "some value",
    "_unknown_field_name_2": "some value"
}
Run Code Online (Sandbox Code Playgroud)

我希望将json结果序列化并反序列化为具有已知字段属性的类,并将未知字段(没有属性)映射到属性(或多个属性),如字典,这样它们就可以了访问和修改.

public class Product
{
    public string id { get; set; }
    public string name { get; set; }
    public Dictionary<string, string> fields { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想我需要一种方法来插入一个json序列化器并自己为缺失的成员做映射(用于序列化和反序列化).我一直在寻找各种可能性:

  • json.net和自定义合约解析器(无法弄清楚如何做)
  • datacontract序列化程序(只能覆盖序列化,序列化)
  • 序列化为动态并进行自定义映射(这可能有效,但似乎很多工作)
  • 让产品继承自DynamicObject(序列化程序使用反射,不调用trygetmember和trysetmember方法)

我正在使用restsharp,但可以插入任何序列化程序.

哦,我无法改变json的结果,或者对我也没有帮助.

更新: 看起来更像它:http://geekswithblogs.net/DavidHoerster/archive/2011/07/26/json.net-custom-convertersndasha-quick-tour.aspx

cec*_*lip 70

解决此问题的更简单方法是使用JSON .NET中的JsonExtensionDataAttribute

public class MyClass
{
   // known field
   public decimal TaxRate { get; set; }

   // extra fields
   [JsonExtensionData]
   private IDictionary<string, JToken> _extraStuff;
}
Run Code Online (Sandbox Code Playgroud)

有这样的项目博客样本这里

更新请注意,这需要JSON .NET v5第5版及更高版本