REST API包装器设计:将动态json作为JSON.NET JObject / JArray返回
我正在为RESTful JSON API编写一个C#包装器,并使用Json.NET将传入的json反序列化为强类型对象。 但是传入json中的一些属性是高度动态的,它将是一些具有不同数量和类型属性的json对象。 我目前的解决方案是,我将动态json属性映射到我的C#类中的Dictionary
(嵌套字典),并编写Custom JsonConverter将动态json转换为嵌套字典。 我的class级看起来像这样:
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 Data { get; set; } }
它很成功。
问题是,很难从这个嵌套字典中为最终用户访问数据,我们甚至无法在Visual Studio中调试数据的结构。 现在我打算使用JObject或JArray而不是嵌套字典。 这样我们就可以通过调用ToString方法(将原始json数据输出为字符串)来查看数据结构,以及这些类型具有LINQ支持,以便用户可以轻松地从中访问数据。
这是一个很好的做法使用它,考虑到JObject和JArray类型都依赖于第三方库(无论如何Json.NET是我的库的依赖,因为我用它来进行json序列化)。 还是有其他方法可以做到这一点?
您应该使用ExpandoObjectConverter
。
您需要键入IDictionary
作为dynamic
并使用[JsonConverter(typeof(ExpandoObjectConverter))]
装饰整个属性。
一个有趣的细节是ExpandoObject
也实现了IDictionary
,但是当你用dynamic
键入它时,你可以像普通的那样访问相关的属性! ;)