Diseño de contenedor REST API: devolviendo json dynamic como JSON.NET JObject / JArray

Estoy escribiendo un envoltorio de C # para una API RESTful JSON, y estoy usando Json.NET para deserializar el json entrante a un objeto fuertemente tipado. pero algunas propiedades en el json entrante son altamente dinámicas, será un objeto json con diferente número y tipo de propiedades. Mi solución actual es, asigné la propiedad json dinámica al Dictionary (Diccionario nested) en mi clase C #, y escribí el JsonConverter personalizado para convertir json dynamic al diccionario nested. Mi clase se ve así:

 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; } } 

Fue un exito.

El problema es que es muy difícil acceder a los datos de este diccionario nested para los usuarios finales, ni siquiera podemos ver cuál es la estructura de los datos sin depurarlos en Visual Studio. Ahora planeo usar JObject o JArray en lugar de un diccionario nested. De modo que podamos ver la estructura de los datos simplemente llamando al método ToString (generará los datos json originales como una cadena), y estos tipos tienen soporte de LINQ para que los usuarios puedan acceder a los datos fácilmente.

Es una buena práctica usar esto, ya que los tipos JObject y JArray dependen de una biblioteca de terceros (de todos modos, Json.NET es una dependencia de mi biblioteca porque la estoy utilizando para la serialización json). ¿O hay otras formas de hacer esto?

Deberías usar ExpandoObjectConverter en ExpandoObjectConverter lugar.

IDictionary escribir su IDictionary como simplemente dynamic y decorar toda la propiedad con [JsonConverter(typeof(ExpandoObjectConverter))] .

Un detalle interesante es que ExpandoObject también implementa IDictionary , pero cuando lo escribe dynamic , puede acceder a propiedades asociadas como las normales. 😉