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

Posted

技术标签:

【中文标题】REST API 包装器设计:将动态 json 作为 JSON.NET JObject / JArray 返回【英文标题】:REST API wrapper design: returning dynamic json as JSON.NET JObject / JArray 【发布时间】:2014-05-17 18:27:25 【问题描述】:

我正在为 RESTful JSON API 编写 C# 包装器,并使用 Json.NET 将传入的 json 反序列化为强类型对象。但是传入的 json 中的一些属性是高度动态的,它将是一些具有不同数量和类型的属性的 json 对象。我目前的解决方案是,我在 C# 类中将动态 json 属性映射到 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 中调试,我们甚至无法看到数据的结构。现在我打算使用JObject 或JArray 而不是嵌套字典。这样我们就可以通过调用 ToString 方法来查看数据的结构(将原始的 json 数据输出为字符串),并且这种类型具有 LINQ 支持,以便用户可以轻松地从中访问数据。

考虑到JObject 和JArray 类型都依赖于第三方库(无论如何,Json.NET 是我的库的依赖项,因为我将它用于 json 序列化),这是一个好习惯吗?还是有其他方法可以做到这一点?

【问题讨论】:

【参考方案1】:

您应该改用ExpandoObjectConverter

您需要将IDictionary&lt;string, object&gt; 输入为dynamic 并使用[JsonConverter(typeof(ExpandoObjectConverter))] 装饰整个属性。

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

【讨论】:

以上是关于REST API 包装器设计:将动态 json 作为 JSON.NET JObject / JArray 返回的主要内容,如果未能解决你的问题,请参考以下文章

编写一个包装器将现有的 REST API 公开为 SOAP Web 服务?

测试包装 api 路由的装饰器

如何通过 Rest API Python 包装器和 WooCommerce Shipment Tracking 插件插入货运跟踪代码

在动态信封中包装 json 响应 - Rest api

在 NodeJS REST api 中动态获取 JSON 数据

在 vue3 组合 api 中动态添加包装器元素