Deserializar las clases JSON a C #

A continuación hay una respuesta (un poco) simplificada que obtengo de una API REST luego de la creación exitosa de una nueva entrada de “código de trabajo”. Necesito deserializar la respuesta en algunas clases, pero estoy perplejo.

Como referencia, estoy usando JSON.NET en .NET 3.5 (ejecutándose en un script SSIS en SQL Server 2008 R2) para intentar mi deserialización. Aquí está el JSON, que obviamente no tengo control ya que proviene de la API de otra persona:

{ "results":{ "jobcodes":{ "1":{ "_status_code":200, "_status_message":"Created", "id":444444444, "assigned_to_all":false, "billable":true, "active":true, "type":"regular", "name":"1234 Main Street - Jackson" }, "2":{ "_status_code":200, "_status_message":"Created", "id":1234567890, "assigned_to_all":false, "billable":true, "active":true, "type":"regular", "name":"4321 Some Other Street - Jackson" } } } } 

En mi código C #, tengo una clase “JobCode” definida que solo asigna parcialmente los valores JSON a las propiedades: no me interesan todos los datos que me han devuelto:

 [JsonObject] class JobCode { [JsonProperty("_status_code")] public string StatusCode { get; set; } [JsonProperty("_status_message")] public string StatusMessage { get; set; } [JsonProperty("id")] public string Id {get; set;} [JsonProperty("name")] public string Name { get; set; } //------------------------------------------------------------------------------- // Empty constructor for JSON serialization support //------------------------------------------------------------------------------- public JobCode() { } } 

Estoy intentando deserializar los datos a través de esta llamada:

 newResource = JsonConvert.DeserializeObject(jsonResponse); 

Donde jsonResponse es el código publicado anteriormente.
Cuando ejecuto el código, “newResource” siempre vuelve como nulo, lo que no es inesperado porque sé que en realidad hay múltiples códigos de trabajo en los datos y este código intenta deserializarlo en un único objeto JobCode. Intenté crear una nueva clase llamada “JobCodes” que se parece a esto:

 class JobCodes { [JsonProperty("jobcodes")] public List_JobCodes { get; set; } } 

Y luego intenté llamar a esto:

 newResource = JsonConvert.DeserializeObject(jsonResponse); 

Pero el problema persiste: mi objeto devuelto es nulo. Lo que me está desanimando, creo, es la presencia de los identificadores “1” y “2”. No sé cómo explicar su presencia en el diseño de mi objeto y / o el uso de los atributos de clase / propiedad JSON.NET como [JsonObject], [JsonProperty], etc.

Cuando ejecuto los datos JSON a través de JSON2CSharp , construye algunas clases de aspecto extraño, por lo que no ha demostrado ser demasiado efectivo. Validé el JSON con varios validadores diferentes y todo se verifica: simplemente no sé lo que me falta aquí.

En última instancia, me gustaría devolver una lista de los datos de JSON, pero estoy perplejo sobre lo que tengo que hacer para que eso suceda.

Tu problema es doble:

  1. No tiene una clase definida en el nivel raíz. La estructura de clase necesita coincidir con el JSON completo , no se puede deserializar desde el centro.
  2. Siempre que tenga un objeto cuyas claves puedan cambiar, necesitará usar un Dictionary . Una clase regular no funcionará para eso; tampoco lo hará una List .

Haz tus clases así:

 class RootObject { [JsonProperty("results")] public Results Results { get; set; } } class Results { [JsonProperty("jobcodes")] public Dictionary JobCodes { get; set; } } class JobCode { [JsonProperty("_status_code")] public string StatusCode { get; set; } [JsonProperty("_status_message")] public string StatusMessage { get; set; } [JsonProperty("id")] public string Id { get; set; } [JsonProperty("name")] public string Name { get; set; } } 

Entonces, deserializa así:

 RootObject obj = JsonConvert.DeserializeObject(json); 

Demostración de trabajo aquí

Excelentes respuestas!

Para aquellos que pueden necesitar más ayuda con la configuración de clase JSON, intente: http://json2csharp.com/#

¡Una forma excelente de generar automáticamente las clases!

O incluso más fácil, en VS, Goto:

Editar -> Pegar especial -> Pegar como clases JSON

Como no puede cambiar el esquema de JSON, y no puede establecer un número constante de propiedades, le sugiero que use JObject

 var jobject = JObject.Parse(json); var results = jobject["results"]; var jobcodes = results["jobcodes"]; var output = jobcodes.Children() .Select(prop => prop.Value.ToObject()) .ToList(); 

Advertencia: el código asume que JSON está siempre en el esquema correcto. También debe manejar el esquema no válido (por ejemplo, donde la propiedad no JobCode esquema JobCode ).