C# REST API包装器设计:将动态json作为json.NET JObject/JArray返回

C# REST API包装器设计:将动态json作为json.NET JObject/JArray返回,c#,json,api,rest,json.net,C#,Json,Api,Rest,Json.net,我正在为RESTful JSON API编写一个C#包装器,并使用它将传入的JSON反序列化为强类型对象。但是传入json中的一些属性是高度动态的,它将是一些具有不同数量和类型属性的json对象。我当前的解决方案是,我将动态json属性映射到C#类中的字典(嵌套字典),并编写自定义JsonConverter将动态json转换为嵌套字典。我的班级是这样的: public class Item { [JsonProperty("item_id")] public int ItemId { g

我正在为RESTful JSON API编写一个C#包装器,并使用它将传入的JSON反序列化为强类型对象。但是传入json中的一些属性是高度动态的,它将是一些具有不同数量和类型属性的json对象。我当前的解决方案是,我将动态json属性映射到C#类中的
字典(嵌套字典),并编写自定义JsonConverter将动态json转换为嵌套字典。我的班级是这样的:

public class Item
{
  [JsonProperty("item_id")]
  public int ItemId { get; set; }

  [JsonProperty("type")]
  public string Type { get; set; }

  //Property to map dynamic json object
  [JsonProperty("data")]
  public Dictionary<string, object> Data { get; set; }
}
公共类项目
{
[JsonProperty(“项目id”)]
公共int ItemId{get;set;}
[JsonProperty(“类型”)]
公共字符串类型{get;set;}
//属性映射动态json对象
[JsonProperty(“数据”)]
公共字典数据{get;set;}
}
这是成功的

问题是,最终用户很难从这个嵌套字典访问数据,如果不在VisualStudio中调试数据,我们甚至看不到数据的结构。现在我计划使用或来代替嵌套字典。因此,我们可以通过调用ToString方法(将原始json数据输出为string)来查看数据结构,并且这种类型具有LINQ支持,因此用户可以轻松地从中访问数据


这是一个好的实践吗?考虑到和类型都依赖于第三方库(无论如何,Json.NET是我的库的一个依赖项,因为我使用它进行Json序列化)。或者有其他方法可以做到这一点?

您应该改用
ExpandoObjectConverter

您需要将您的
IDictionary
键入为
dynamic
,并使用
[JsonConverter(typeof(ExpandoObjectConverter))]
装饰整个属性

一个有趣的细节是
ExpandoObject
还实现了
IDictionary
,但是当您使用
dynamic
键入它时,您可以像普通属性一样访问相关属性!)