HOWTO · Csharp

Cómo convertir una cadena JSON en un JObject en C#

Analiza texto JSON en un JObject en C# con Newtonsoft.Json, lee valores anidados, gestiona los errores de análisis y serializa los cambios.

En esta página

Para convertir texto JSON en un objeto en memoria en C#, instala Newtonsoft.Json y llama a JObject.Parse() con el texto. El método devuelve un JObject cuyas propiedades puedes leer o actualizar. La entrada ya debe ser JSON válido; el análisis no convierte texto plano arbitrario en JSON.

Convertir una cadena JSON en un JObject con JObject.Parse()

Instala el paquete con dotnet add package Newtonsoft.Json. La conversión en sí es JObject person = JObject.Parse(jsonText);; JObject.Parse() forma parte de Newtonsoft.Json y requiere que ese paquete esté disponible en el proyecto. El siguiente ejemplo de C# autónomo usa la API integrada System.Text.Json para mostrar el mismo flujo de entrada y lectura de propiedades sin esa dependencia externa. Crea un JsonDocument, no un JObject.

using System;
using System.Text.Json;

class Program
{
    static void Main()
    {
        string jsonText = "{\"name\":\"John\",\"address\":{\"city\":\"New York\"}}";
        using (JsonDocument person = JsonDocument.Parse(jsonText))
        {
            Console.WriteLine(person.RootElement.GetProperty("name").GetString());
            Console.WriteLine(person.RootElement.GetProperty("address").GetProperty("city").GetString());
        }
    }
}

Aquí, jsonText es una cadena y person es un documento JSON en memoria. Para un JObject de Newtonsoft.Json, usa JObject.Parse(jsonText) como se mostró antes; su indexador devuelve un token JSON, que puede representar una cadena, un número, un objeto anidado, una matriz u otro valor JSON. El ejemplo integrado demuestra la misma forma JSON con System.Text.Json y no crea un JObject.

Usa JObject cuando la raíz del texto JSON es un objeto con propiedades con nombre. Si la raíz es una matriz, usa en su lugar la API JArray de Newtonsoft.Json. Conserva el texto original en una variable de cadena y pasa esa variable al analizador; no añadas otro juego de comillas alrededor de todo el documento JSON.

Gestionar JSON no válido

JObject.Parse() espera un objeto JSON. Un JSON mal formado o un valor de nivel superior que no sea un objeto puede producir una JsonReaderException. Cuando la entrada procede de una fuente externa, captura esa excepción específica y decide cómo debe informar o registrar el problema la aplicación. El patrón de C# es try { JObject person = JObject.Parse(jsonText); } catch (JsonReaderException) { Console.WriteLine("The JSON text could not be parsed."); }. Se trata de una ilustración de sintaxis no ejecutada, porque el entorno de ejecución proporcionado carece de Newtonsoft.Json. Mantén el bloque catch centrado en los errores de análisis; registra los detalles del analizador en el código de la aplicación en lugar de exponerlos a los usuarios finales.

El bloque catch gestiona los fallos del análisis, de modo que el resto de la aplicación puede elegir una alternativa útil, pedir una entrada corregida o registrar un diagnóstico. Si la entrada ya es de confianza y no pueden producirse datos mal formados, el llamador puede dejar que la excepción se propague a su gestor de errores habitual. El análisis solo comprueba la estructura JSON; no verifica que los campos requeridos por la aplicación estén presentes ni que tengan el significado de negocio esperado.

Leer valores de un JObject

Usa un indexador como person["name"] para leer una propiedad de nivel superior. Encadena indexadores para valores anidados, como en person["address"]?["city"]; el operador condicional de nulo detiene la búsqueda si la propiedad intermedia está ausente o es nula. Los accesores con tipo convierten los tokens en valores de .NET: por ejemplo, person.Value<string>("name") o person["age"]?.Value<int>(). Elige un tipo que coincida con el valor JSON y gestiona la ausencia de una propiedad cuando tu aplicación la requiera.

El indexador resulta cómodo cuando quieres seguir trabajando con tokens JSON, mientras que Value<T>() es útil cuando se necesita una cadena de .NET, un entero u otro valor con tipo. Un resultado nulo de una búsqueda segura permite a tu código distinguir un valor intermedio ausente antes de usarlo. Para datos requeridos, comprueba el token e informa de qué propiedad falta en lugar de suponer que cada entrada tiene la misma forma.

Modificar y serializar un JObject

Asigna un valor a una propiedad existente para actualizarla, o usa un nombre de propiedad nuevo para añadir un valor. Llama a ToString() para producir texto JSON con formato. Por ejemplo, las operaciones de C# son person["age"] = 31;, person["city"] = "New York"; y string updatedJson = person.ToString();. Estas llamadas a la API son ilustraciones no ejecutadas, porque el entorno de ejecución proporcionado carece de Newtonsoft.Json. La cadena resultante representa el objeto actualizado en memoria como JSON y puede pasarse a una API o a una capa de almacenamiento que espere JSON.

La mutación cambia el JObject en memoria; no cambia la variable de cadena JSON original. Serializa después de completar todas las ediciones y usa el texto resultante donde el siguiente paso espere JSON. Si se prefiere una salida compacta, Newtonsoft.Json también admite opciones de formato para la serialización; elige el formato según si el texto lo leerán personas u otro programa.