¿Deserializar JSON con un arreglo en DataTable?
Sé que esta pregunta es muy popular aquí en StackOverflow, pero no puedo encontrar una solución adecuada… He revisado prácticamente todas las preguntas relacionadas con esto, he probado casi todos los métodos, pero ninguno ha funcionado…
Al parecer, mi problema es que tengo arrays dentro de mi JSON y el deserializador de JSON.Net no lo acepta en absoluto. Así que, mi última opción es publicar una pregunta yo mismo.
Aquí está mi JSON:
{
"artists": [
{
"Name": "artista",
"URL": "www.example.com",
"Desc": "artista muy bueno",
"Rating": 5,
"NSFW": false,
"Tags": ["bueno", "épico"],
"fav": true
},
{
"Name": "otro artista",
"URL": "www.test.net",
"Desc": "súper genial",
"Rating": 3,
"NSFW": true,
"Tags": ["digital", "comisiones"],
"fav": false
}
]
}
Y aquí está mi código en C#:
“`c#
using StreamReader r = new StreamReader("C:\ruta\hacia\archivo.json");
string json = r.ReadToEnd();
DataTable dt = JsonConvert.DeserializeObject<datatable>(json);
<pre><code>Pero cuando intento ejecutarlo, obtengo la siguiente excepción:
“`code
Newtonsoft.Json.JsonSerializationException: ‘Símbolo JSON inesperado al leer DataTable. Se esperaba StartArray, se obtuvo StartObject. Ruta ”, línea 1, posición 1.’
En esta pregunta en particular, hay una respuesta que intenta solucionar este mismo problema que tengo, pero lamentablemente no pude hacer que funcionara.
Créeme, he intentado todo lo que parecía adecuado para este problema y aún no puedo resolverlo, por favor ayuda. No incluiré el código que he utilizado para otras soluciones a este problema, como deserializarlo a una clase personalizada, porque eso haría todo aún más confuso. Estoy usando Visual Studio 2022, .NET 6.0 en un proyecto de WinForms.
davy.ai
Si estás intentando deserializar JSON con matrices a un DataTable usando C# y Json.net y te encuentras con una excepción como “Se esperaba StartArray, se obtuvo StartObject”, el problema probablemente esté en la estructura del JSON.
La razón de esta excepción es que Json.net espera que una matriz comience con el carácter “[” y no con el carácter “{“. En el JSON proporcionado, la propiedad “artists” es una matriz de objetos JSON, pero el deserializador está tratando de considerarla como un solo objeto JSON, lo cual es incorrecto.
Una solución a este problema es deserializar primero el JSON a una clase personalizada que represente la estructura del JSON y luego convertirla en un DataTable usando LINQ. Aquí tienes un ejemplo de código que demuestra esto:
“`c#
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
namespace JsonToDataTable
{
class Program
{
static void Main(string[] args)
{
string jsonFilePath = @”C:\ruta\al\archivo.json”;
}
“`
El código anterior define una clase personalizada para el JSON,
JsonData
, que tiene una propiedadartists
que es una lista de objetosArtist
. La claseArtist
define la estructura de los objetos JSON dentro de la matrizartists
.El código luego deserializa el JSON a una instancia de
JsonData
utilizandoJsonConvert.DeserializeObject<jsondata>
. El siguiente paso es convertir la listaartists
en unDataTable
usando LINQ.El primer bucle
foreach
itera sobre las propiedades de la claseArtist
y agrega columnas alDataTable
con los mismos nombres y tipos. El segundo bucleforeach
itera sobre la listaartists
y agrega filas alDataTable
con los valores de las propiedades de cada objetoArtist
.Finalmente, el
DataTable
se muestra en la consola.Espero que esta solución te ayude a deserializar tu JSON con matrices a un DataTable usando C# y Json.net.