C# REST API包装器设计:将动态json作为json.NET JObject/JArray返回
我正在为RESTful JSON API编写一个C#包装器,并使用它将传入的JSON反序列化为强类型对象。但是传入json中的一些属性是高度动态的,它将是一些具有不同数量和类型属性的json对象。我当前的解决方案是,我将动态json属性映射到C#类中的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
字典(嵌套字典),并编写自定义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
键入它时,您可以像普通属性一样访问相关属性!)