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

5

我正在为一个 RESTful JSON API 编写 C# 封装,并使用 Json.NET 将传入的 json 反序列化为强类型对象。但是,一些传入的 json 属性非常动态,将是具有不同数量和类型属性的一些 json 对象。我的当前解决方案是,将动态 json 属性映射到我的 C# 类中的 Dictionary<string, object>(嵌套字典),并编写自定义 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; }
}

它是成功的。

问题在于,对于最终用户来说,从这个嵌套字典中访问数据非常困难,我们甚至无法通过在Visual Studio中调试来查看数据的结构。现在我计划使用 JObjectJArray 代替嵌套字典。这样,我们只需调用ToString方法(将输出原始JSON数据作为字符串),就能看到数据的结构,而且这些类型都具有LINQ支持,使用户可以轻松地访问数据。

考虑到 JObjectJArray 类型都依赖于第三方库(无论如何,Json.NET 是我的库的一个依赖项,因为我正在使用它进行 JSON 序列化)。那么这种做法是否可行?或者还有其他方法吗?

1个回答

2
你应该使用ExpandoObjectConverter
你需要将你的IDictionary<string, object>类型声明为dynamic,并且在整个属性上加上[JsonConverter(typeof(ExpandoObjectConverter))]注解。
有一个有趣的细节是ExpandoObject也实现了IDictionary<string, object>,但当你使用dynamic关键字类型声明时,你可以像访问常规属性一样访问它的相关属性! ;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接