一尘不染

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

c#

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

{
    "id": "7908",
    "name": "product name"
}

但是可以使用其他字段(在此示例中为_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"
}

我想将json结果序列化并反序列化到具有已知字段属性的类中,并将未知字段(没有属性)映射到一个属性(或多个属性),如字典,以便可以访问和修改。

public class Product
{
    public string id { get; set; }
    public string name { get; set; }
    public Dictionary<string, string> fields { get; set; }
}

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

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

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

哦,我无法更改json结果,这个这个都没有帮助我。

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


阅读 322

收藏
2020-05-19

共1个答案

一尘不染

解决此问题的一个更简单的选择是使用JSON
.NET中的JsonExtensionDataAttribute

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

   // extra fields
   [JsonExtensionData]
   private IDictionary<string, JToken> _extraStuff;
}

这里的项目博客中有一个示例

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

2020-05-19