¿Cómo convierto un objeto C # en una cadena JSON en .NET?

Tengo clases como estas:

class MyDate
{
    int year, month, day;
}

class Lad
{
    string firstName;
    string lastName;
    MyDate dateOfBirth;
}

Y me gustaría convertir un Lad objetar en un JSON cadena como esta:

{
    "firstName":"Markoff",
    "lastName":"Chaney",
    "dateOfBirth":
    {
        "year":"1901",
        "month":"4",
        "day":"30"
    }
}

(Sin formato). encontré este enlace, pero usa un espacio de nombres que no está en .NET 4. También escuché sobre JSON.NET, pero su sitio parece estar caído en este momento, y no estoy interesado en usar archivos DLL externos.

¿Hay otras opciones además de crear manualmente un JSON escritor de cadenas?

preguntado el 01 de junio de 11 a las 09:06

JSON.net se puede cargar aquí Otra solución más rápida (como dicen, no la probé yo mismo) es ServiceStack.Texto No recomendaría ejecutar su propio analizador JSON. Es probable que sea más lento y más propenso a errores o tendrá que invertir mucho tiempo. -

sí. C # tiene un tipo llamado JavaScriptSerializer -

Hm ... por lo que puedo ver, debería poder usar: msdn.microsoft.com/en-us/library/… Que también está en .Net 4.0 según la página de MSDN. Debería poder utilizar el método Serialize (Object obj): msdn.microsoft.com/en-us/library/bb292287.aspx ¿Me estoy perdiendo de algo? Por cierto. tu enlace parece ser un código y no un enlace -

Sin mencionar que no tiene dependencias en los espacios de nombres System.Web.Xyz ... -

17 Respuestas

Podrías usar el JavaScriptSerializer clase (agregar referencia a System.Web.Extensions):

using System.Web.Script.Serialization;
var json = new JavaScriptSerializer().Serialize(obj);

Un ejemplo completo:

using System;
using System.Web.Script.Serialization;

public class MyDate
{
    public int year;
    public int month;
    public int day;
}

public class Lad
{
    public string firstName;
    public string lastName;
    public MyDate dateOfBirth;
}

class Program
{
    static void Main()
    {
        var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = new JavaScriptSerializer().Serialize(obj);
        Console.WriteLine(json);
    }
}

contestado el 10 de mayo de 21 a las 18:05

Tenga en cuenta que Microsoft sugiere usar JSON.net en lugar de esta solución. Creo que esta respuesta se volvió inapropiada. Eche un vistazo a la respuesta de Willsteel. Fuente: https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx. - rzelek

@DarinDimitrov debería considerar agregar una pista sobre JSON.net. Microsoft lo recomienda sobre JavascriptSerializer: msdn.microsoft.com/en-us/library/… También puede agregar una pista a msdn.microsoft.com/en-us/library/… cuál es el enfoque incluido en el marco - mafii

aquí is herramienta en línea para convertir tu classes a json formato, la esperanza ayuda a alguien. - Shaiju T

¿Por qué Microsoft recomendaría una solución de terceros en lugar de la suya propia? Su redacción también es muy extraña: "Json.NET debe usarse serialización y deserialización. Proporciona funcionalidad de serialización y deserialización para aplicaciones habilitadas para AJAX". - Protector uno

Solo un aviso, para hacer referencia a System.Web.Extensions, debes tener ASP.NET AJAX 1.0 or ASP.NET 3.5 instalado en su sistema. Por favor mira esto stackoverflow.com/questions/7723489/… - Peine

Ya que a todos nos encantan las frases ingeniosas

... éste depende del paquete Newtonsoft NuGet, que es popular y mejor que el serializador predeterminado.

Newtonsoft.Json.JsonConvert.SerializeObject(new {foo = "bar"})

Documentación: Serializar y deserializar JSON

Respondido 27 Abr '20, 23:04

El serializador Newtonsoft es mucho más rápido y más personalizable que integrado. Recomiendo encarecidamente su uso. Gracias por la respuesta @willsteel - Andrés

@JosefPfleger el precio es para JSON.NET Schema, no JSON.NET el serializador regular, que es MIT - david cums

Mis pruebas mostraron que Newtonsoft es más lento que la clase JavaScriptSerializer. (.NET 4.5.2) - nemke

Si lee la documentación de MSDN para JavaScriptSerializer, dice rotundamente use JSON.net. - dsghi

@JosefPfleger Newtionsoft JSON.net tiene licencia del MIT ... puede hacer modificaciones y revenderlo si lo desea. Su página de precios trata sobre soporte técnico comercial y algún validador de esquemas que tienen. - cb88

Utiliza Json.Net biblioteca, puede descargarlo desde Nuget Packet Manager.

Serializando a Json String:

 var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };

var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

Deserializando a Objeto:

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );

Respondido el 21 de junio de 17 a las 09:06

Use el DataContractJsonSerializer clase: MSDN1, MSDN2.

Mi ejemplo: AQUÍ.

También puede deserializar de forma segura objetos de una cadena JSON, a diferencia de JavaScriptSerializer. Pero personalmente sigo prefiriendo Json.NET.

Respondido 15 Jul 16, 15:07

Todavía no veo ningún ejemplo en esa página, pero aquí hay algunos sobre MSDN y en otra parte -> el último usa métodos de extensión para lograr frases ingeniosas. - cristian diaconescu

Oh, me perdí el segundo enlace de MSDN :) - cristian diaconescu

No serializa clases simples. El error informó "Considere marcarlo con el atributo DataContractAttribute y marcar todos los miembros que desea serializar con el atributo DataMemberAttribute. Si el tipo es una colección, considere marcarlo con CollectionDataContractAttribute". - miguel freidgeim

@MichaelFreidgeim Así es, debe marcar las propiedades en la clase que desea serializar con atributos. DataContractAttributeDataContractAttribute Atributo de miembro de datos - Edgar

@MichaelFreidgeim Cuál es mejor depende de los requisitos. Los atributos le permiten configurar cómo se serializa la propiedad. - Edgar

Un nuevo serializador JSON está disponible en el System.Text.Json espacio de nombres. Está incluido en el marco compartido de .NET Core 3.0 y está en un Paquete NuGet para proyectos destinados a .NET Standard o .NET Framework o .NET Core 2.x.

Código de ejemplo:

using System;
using System.Text.Json;

public class MyDate
{
    public int year { get; set; }
    public int month { get; set; }
    public int day { get; set; }
}

public class Lad
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public MyDate DateOfBirth { get; set; }
}

class Program
{
    static void Main()
    {
        var lad = new Lad
        {
            FirstName = "Markoff",
            LastName = "Chaney",
            DateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = JsonSerializer.Serialize(lad);
        Console.WriteLine(json);
    }
}

En este ejemplo, las clases que se van a serializar tienen propiedades en lugar de campos; la System.Text.Json serializer actualmente no serializa campos.

Documentación:

Respondido 08 Oct 19, 22:10

Puede lograr esto utilizando Newtonsoft.json. Instale Newtonsoft.json desde NuGet. Y luego:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

Respondido 27 Abr '20, 23:04

¡Wooou! Realmente mejor usando un marco JSON :)

Aquí está mi ejemplo usando Json.NET (http://james.newtonking.com/json):

using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using System.IO;

namespace com.blogspot.jeanjmichel.jsontest.model
{
    public class Contact
    {
        private Int64 id;
        private String name;
        List<Address> addresses;

        public Int64 Id
        {
            set { this.id = value; }
            get { return this.id; }
        }

        public String Name
        {
            set { this.name = value; }
            get { return this.name; }
        }

        public List<Address> Addresses
        {
            set { this.addresses = value; }
            get { return this.addresses; }
        }

        public String ToJSONRepresentation()
        {
            StringBuilder sb = new StringBuilder();
            JsonWriter jw = new JsonTextWriter(new StringWriter(sb));

            jw.Formatting = Formatting.Indented;
            jw.WriteStartObject();
            jw.WritePropertyName("id");
            jw.WriteValue(this.Id);
            jw.WritePropertyName("name");
            jw.WriteValue(this.Name);

            jw.WritePropertyName("addresses");
            jw.WriteStartArray();

            int i;
            i = 0;

            for (i = 0; i < addresses.Count; i++)
            {
                jw.WriteStartObject();
                jw.WritePropertyName("id");
                jw.WriteValue(addresses[i].Id);
                jw.WritePropertyName("streetAddress");
                jw.WriteValue(addresses[i].StreetAddress);
                jw.WritePropertyName("complement");
                jw.WriteValue(addresses[i].Complement);
                jw.WritePropertyName("city");
                jw.WriteValue(addresses[i].City);
                jw.WritePropertyName("province");
                jw.WriteValue(addresses[i].Province);
                jw.WritePropertyName("country");
                jw.WriteValue(addresses[i].Country);
                jw.WritePropertyName("postalCode");
                jw.WriteValue(addresses[i].PostalCode);
                jw.WriteEndObject();
            }

            jw.WriteEndArray();

            jw.WriteEndObject();

            return sb.ToString();
        }

        public Contact()
        {
        }

        public Contact(Int64 id, String personName, List<Address> addresses)
        {
            this.id = id;
            this.name = personName;
            this.addresses = addresses;
        }

        public Contact(String JSONRepresentation)
        {
            //To do
        }
    }
}

La prueba:

using System;
using System.Collections.Generic;
using com.blogspot.jeanjmichel.jsontest.model;

namespace com.blogspot.jeanjmichel.jsontest.main
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<Address> addresses = new List<Address>();
            addresses.Add(new Address(1, "Rua Dr. Fernandes Coelho, 85", "15º andar", "São Paulo", "São Paulo", "Brazil", "05423040"));
            addresses.Add(new Address(2, "Avenida Senador Teotônio Vilela, 241", null, "São Paulo", "São Paulo", "Brazil", null));

            Contact contact = new Contact(1, "Ayrton Senna", addresses);

            Console.WriteLine(contact.ToJSONRepresentation());
            Console.ReadKey();
        }
    }
}

El resultado:

{
  "id": 1,
  "name": "Ayrton Senna",
  "addresses": [
    {
      "id": 1,
      "streetAddress": "Rua Dr. Fernandes Coelho, 85",
      "complement": "15º andar",
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": "05423040"
    },
    {
      "id": 2,
      "streetAddress": "Avenida Senador Teotônio Vilela, 241",
      "complement": null,
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": null
    }
  ]
}

Ahora implementaré el método constructor que recibirá una cadena JSON y completará los campos de la clase.

contestado el 07 de mayo de 15 a las 16:05

Buen post, esta es la forma más actual de hacerlo. - matthewd

Supongo que uno espera encontrar una prueba unitaria en la sección "La prueba", mientras que no hay ninguna. por cierto, me gusta el enfoque donde el Contact el objeto sabe cómo convertirse a JSON. Lo que no me gusta de este ejemplo es que el objeto no es en realidad un objeto desde la perspectiva de la programación orientada a objetos, sino simplemente un montón de métodos y propiedades públicos. - Artur Beljajev

"com.blogspot.jeanjmichel.jsontest.main"Ah, un programador de Java cae en el lado oscuro. Bienvenido. Tenemos cookies. - Corey

Jajajajaja sí @Corey =) - Juan J. Michel

Si no son muy grandes, ¿cuál es probablemente su caso, expórtelo como JSON?

Además, esto lo hace portátil entre todas las plataformas.

using Newtonsoft.Json;

[TestMethod]
public void ExportJson()
{
    double[,] b = new double[,]
        {
            { 110,  120,  130,  140, 150 },
            {1110, 1120, 1130, 1140, 1150},
            {1000,    1,   5,     9, 1000},
            {1110,    2,   6,    10, 1110},
            {1220,    3,   7,    11, 1220},
            {1330,    4,   8,    12, 1330}
        };

    string jsonStr = JsonConvert.SerializeObject(b);

    Console.WriteLine(jsonStr);

    string path = "X:\\Programming\\workspaceEclipse\\PyTutorials\\src\\tensorflow_tutorials\\export.txt";

    File.WriteAllText(path, jsonStr);
}

Respondido 27 Abr '20, 23:04

Si está en un controlador web ASP.NET MVC, es tan simple como:

string ladAsJson = Json(Lad);

No puedo creer que nadie haya mencionado esto.

Respondido el 16 de Septiembre de 16 a las 16:09

Recibo un error acerca de no poder transmitir jsonresult a la cadena. - csga5000

Se compilará con escritura implícita: var ladAsJson = Json (Lad). - womack

Votaría por el serializador JSON de ServiceStack:

using ServiceStack;

string jsonString = new { FirstName = "James" }.ToJson();

También es el serializador JSON más rápido disponible para .NET: http://www.servicestack.net/benchmarks/

Respondido el 22 de junio de 20 a las 12:06

Esos son puntos de referencia muy antiguos. Acabo de probar las tres versiones actuales de Newtonsoft, ServiceStack y JavaScriptSerializer y actualmente Newtonsoft es la más rápida. Aunque todos lo hacen bastante rápido. - miguel logutov

ServiceStack no parece ser gratuito. - joelnet

@joelnet, este es ahora el caso, pero estaba libre al responder la pregunta. Sin embargo, es gratis para sitios pequeños, y todavía lo estoy usando a pesar de que es de pago, es un marco excelente. - James

Algunos puntos de referencia aquí, aunque no hay para la serialización por sí solo: docs.servicestack.net/real-world-rendimiento - Juan L. Evan

@joelnet Parece ser gratis ahora. No sé cuándo lo cambiaron. - Aage

Utiliza estas herramientas para generar una clase C #, y luego use este código para serializar su objeto:

 var json = new JavaScriptSerializer().Serialize(obj);

Respondido 27 Abr '20, 23:04

Es tan fácil como esto (también funciona para objetos dinámicos (tipo objeto)):

string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);

Respondido 27 Abr '20, 23:04

no hay un script predeterminado en web. :( - M en

Intenté eso, pero no. Script Supongo que debería agregarlo como referencia. Así que muchas gracias M en

Utilice el siguiente código para convertir XML a JSON.

var json = new JavaScriptSerializer().Serialize(obj);

respondido 09 nov., 14:09

El código se duplica esta respuesta -- pero JavaScriptSerializer no tiene la capacidad de convertir directamente de XML a JSON como está implícito en el texto. - dbc

Otra solución usando System.Text.Json (.NET Core 3.0+, .NET 5) donde un el objeto es autosuficiente y no expone todos los campos posibles:

Una prueba aprobatoria:

using NUnit.Framework;

namespace Intech.UnitTests
{
    public class UserTests
    {
        [Test]
        public void ConvertsItselfToJson()
        {
            var userName = "John";
            var user = new User(userName);

            var actual = user.ToJson();

            Assert.AreEqual($"{{\"Name\":\"{userName}\"}}", actual);
        }
    }
}

Una implementación:

using System.Text.Json;
using System.Collections.Generic;

namespace Intech
{
    public class User
    {
        private readonly string Name;

        public User(string name)
        {
            this.Name = name;
        }

        public string ToJson()
        {
            var params = new Dictionary<string, string>{{"Name", Name}};
            return JsonSerializer.Serialize(params);
        }
    }
}

respondido 25 mar '21, 18:03

Tengo que escribir código en una máquina virtual que no está conectada a Internet, por lo que esto es muy útil. - tomdestry

Aquí hay otra solución usando Cinchoo ETL - una biblioteca de código abierto

public class MyDate
{
    public int year { get; set; }
    public int month { get; set; }
    public int day { get; set; }
}

public class Lad
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public MyDate dateOfBirth { get; set; }
}

static void ToJsonString()
{
    var obj = new Lad
    {
        firstName = "Tom",
        lastName = "Smith",
        dateOfBirth = new MyDate
        {
            year = 1901,
            month = 4,
            day = 30
        }
    };
    var json = ChoJSONWriter.Serialize<Lad>(obj);

    Console.WriteLine(json);
}

Salida:

{
  "firstName": "Tom",
  "lastName": "Smith",
  "dateOfBirth": {
    "year": 1901,
    "month": 4,
    "day": 30
  }
}

Descargo de responsabilidad: soy el autor de esta biblioteca.

respondido 25 mar '21, 18:03

Serializador

 public static void WriteToJsonFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
        var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite, new JsonSerializerSettings
        {
            Formatting = Formatting.Indented,
        });
        using (var writer = new StreamWriter(filePath, append))
        {
            writer.Write(contentsToWriteToFile);
        }
}

Objeto

namespace MyConfig
{
    public class AppConfigurationSettings
    {
        public AppConfigurationSettings()
        {
            /* initialize the object if you want to output a new document
             * for use as a template or default settings possibly when 
             * an app is started.
             */
            if (AppSettings == null) { AppSettings=new AppSettings();}
        }

        public AppSettings AppSettings { get; set; }
    }

    public class AppSettings
    {
        public bool DebugMode { get; set; } = false;
    }
}

Implementación

var jsonObject = new AppConfigurationSettings();
WriteToJsonFile<AppConfigurationSettings>(file.FullName, jsonObject);

Salida

{
  "AppSettings": {
    "DebugMode": false
  }
}

Respondido 03 Feb 16, 19:02

En su clase de modelo Lad, agregue una anulación a la Tostring () método que devuelve una versión de cadena JSON de su objeto Lad.
Nota: deberá importar Sistema.Texto.Json;

using System.Text.Json;

class MyDate
{
    int year, month, day;
}

class Lad
{
    public string firstName { get; set; };
    public string lastName { get; set; };
    public MyDate dateOfBirth { get; set; };
    public override string ToString() => JsonSerializer.Serialize<Lad>(this);
}

Respondido 14 Feb 21, 06:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.