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

Ajm*_* VH 5 c# api rest json json.net

我正在为RESTful JSON API编写一个C#包装器,并使用Json.NET将传入的json反序列化为强类型对象.但是传入json中的一些属性是高度动态的,它将是一些具有不同数量和类型属性的json对象.我目前的解决方案是,我将动态json属性映射到Dictionary<string, object>我的C#类中的(嵌套字典),并编写Custom 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; }
}
Run Code Online (Sandbox Code Playgroud)

它很成功.

问题是,从最终用户的嵌套字典中访问数据非常困难,我们甚至无法在Visual Studio中调试数据的结构.现在我打算使用JObjectJArray而不是嵌套字典.这样我们就可以通过调用ToString方法(将原始的json数据输出为字符串)来查看数据结构,以及这些类型具有LINQ支持,以便用户可以轻松地从中访问数据.

这是一个很好的做法使用它,考虑到 JObjectJArray类型都依赖于第三方库(无论如何Json.NET是我的库的依赖,因为我用它来进行json序列化).还是有其他方法可以做到这一点?

Mat*_*zer 2

你应该改用ExpandoObjectConverter

您需要输入您的IDictionary<string, object>as justdynamic并用 装饰整个财产[JsonConverter(typeof(ExpandoObjectConverter))]

一个有趣的细节也是ExpandoObjectImplements IDictionary<string, object>,但是当您使用 键入它时dynamic,您可以像常规属性一样访问关联的属性!;)