una serializeobject newtonsoft leer jsonconvert deserialize deserializar como cadena c# .net json serialization

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



string to json c# (14)

Tengo clases como estas:

class MyDate { int year, month, day; } class Lad { string firstName; string lastName; MyDate dateOfBirth; }

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

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

(sin el formato). Encontré este enlace , pero utiliza un espacio de nombres que no está en .NET 4. También escuché sobre JSON.NET , pero su sitio parece estar inactivo en este momento, y no estoy interesado en usar archivos DLL externos. ¿Hay otras opciones además de crear manualmente un escritor de cadenas JSON?



Podría usar la clase msdn.microsoft.com/en-us/library/… (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); } }


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.


Si no son muy grandes, ¿cuál es probablemente su caso exportarlo como Json. También 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); }


Tan fácil como esto, funciona también para objetos dinámicos (tipo de objeto):

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


Tenga cuidado de crear su clase con el atributo correcto también:

Cree esta clase con el atributo <Serializable> según el ejemplo de ejemplo de C # seguido de vb.net exmpale

DO#

using Microsoft.VisualBasic; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Script.Serialization; namespace Samples { [Serializable()] public class Customer { private int _idcustomer; public int IDCustomer { get { return _idcustomer; } set { _idcustomer = value; } } private System.DateTime _RegistrationDate; public System.DateTime RegistrationDate { get { return _RegistrationDate; } set { _RegistrationDate = value; } } private string _Name; public string Name { get { return _Name; } set { _Name = value; } } private string _Surname; public string Surname { get { return _Surname; } set { _Surname = value; } } } [Serializable()] public class Product { private int _ProductID; public int ProductID { get { return _ProductID; } set { _ProductID = value; } } private string _ProductName; public string ProductName { get { return _ProductName; } set { _ProductName = value; } } private int _Price; public int Price { get { return _Price; } set { _Price = value; } } private bool _inStock; public bool inStock { get { return _inStock; } set { _inStock = value; } } } [Serializable()] public class Order { private int _OrderId; public int OrderID { get { return _OrderId; } set { _OrderId = value; } } private int _customerID; public int CustomerID { get { return _customerID; } set { _customerID = value; } } private List<Product> _ProductsList; public List<Product> ProductsList { get { return _ProductsList; } set { _ProductsList = value; } } private System.DateTime _PurchaseDate; public System.DateTime PurchaseDate { get { return _PurchaseDate; } set { _PurchaseDate = value; } } private string _PaymentMethod; public string PaymentMethod { get { return _PaymentMethod; } set { _PaymentMethod = value; } } public string ToJson() { string json = string.Empty; JavaScriptSerializer js = new JavaScriptSerializer(); json = js.Serialize(this); js = null; return json; } } }

EJEMPLO VBNET

Imports System Imports System.Web Imports System.Web.Script.Serialization Namespace Samples <Serializable()> Public Class Customer Private _idcustomer As Integer Public Property IDCustomer() As Integer Get Return _idcustomer End Get Set(ByVal value As Integer) _idcustomer = value End Set End Property Private _RegistrationDate As Date Public Property RegistrationDate() As Date Get Return _RegistrationDate End Get Set(ByVal value As Date) _RegistrationDate = value End Set End Property Private _Name As String Public Property Name() As String Get Return _Name End Get Set(ByVal value As String) _Name = value End Set End Property Private _Surname As String Public Property Surname() As String Get Return _Surname End Get Set(ByVal value As String) _Surname = value End Set End Property End Class <Serializable()> Public Class Product Private _ProductID As Integer Public Property ProductID() As Integer Get Return _ProductID End Get Set(ByVal value As Integer) _ProductID = value End Set End Property Private _ProductName As String Public Property ProductName() As String Get Return _ProductName End Get Set(ByVal value As String) _ProductName = value End Set End Property Private _Price As Integer Public Property Price() As Integer Get Return _Price End Get Set(ByVal value As Integer) _Price = value End Set End Property Private _inStock As Boolean Public Property inStock() As Boolean Get Return _inStock End Get Set(ByVal value As Boolean) _inStock = value End Set End Property End Class <Serializable> Public Class Order Private _OrderId As Integer Public Property OrderID() As Integer Get Return _OrderId End Get Set(ByVal value As Integer) _OrderId = value End Set End Property Private _customerID As Integer Public Property CustomerID() As Integer Get Return _customerID End Get Set(ByVal value As Integer) _customerID = value End Set End Property Private _ProductsList As List(Of Product) Public Property ProductsList() As List(Of Product) Get Return _ProductsList End Get Set(ByVal value As List(Of Product)) _ProductsList = value End Set End Property Private _PurchaseDate As Date Public Property PurchaseDate() As Date Get Return _PurchaseDate End Get Set(ByVal value As Date) _PurchaseDate = value End Set End Property Private _PaymentMethod As String Public Property PaymentMethod() As String Get Return _PaymentMethod End Get Set(ByVal value As String) _PaymentMethod = value End Set End Property Public Function ToJson() As String Dim json As String = String.Empty Dim js As New JavaScriptSerializer json = js.Serialize(Me) js = Nothing Return json End Function End Class

Espacio de nombres final

El segundo paso es crear una prueba simple como esta:

DO#

void Main() { List<Samples.Product> ListProducts = new List<Samples.Product>(); ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10, .ProductID=1,.ProductName=BookOne); ListProducts.Add(new Samples.Product(), With, {.inStock=False,. Price=10, .ProductID=2, .ProductName=Hotels California); ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10,.ProductID=3,.ProductName=Cbr); ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10,.ProductID=4,.ProductName=Mustang); ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10, .ProductID=15,.ProductName=Anything); ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10,.ProductID=38,.ProductName=Monster Truck); Samples.Customer Customer = new Samples.Customer(); // With... Customer.IDCustomer = 1; Customer.Name = "Customer1"; Customer.RegistrationDate = Now; Customer.Surname = "SurnameCustomer"; Samples.Order Order = new Samples.Order(); // With... Order.CustomerID = Customer.IDCustomer; Order.OrderID = 1; Order.PaymentMethod = "PayPal"; Order.ProductsList = ListProducts; Order.PurchaseDate = Now; Console.WriteLine(Order.ToJson); Console.ReadLine(); }

VB.NET

Sub Main() Dim ListProducts As New List(Of Samples.Product) ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10, .ProductID = 1, .ProductName = "BookOne"}) ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10, .ProductID = 2, .ProductName = "Hotels California"}) ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10, .ProductID = 3, .ProductName = "Cbr"}) ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10, .ProductID = 4, .ProductName = "Mustang"}) ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10, .ProductID = 15, .ProductName = "Anything"}) ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10, .ProductID = 38, .ProductName = "Monster Truck"}) Dim Customer As New Samples.Customer With {.IDCustomer = 1, .Name = "Customer1",.RegistrationDate = Now, .Surname ="SurnameCustomer"} Dim Order As New Samples.Order With { .CustomerID = Customer.IDCustomer, .OrderID = 1, .PaymentMethod = "PayPal", .ProductsList = ListProducts, .PurchaseDate = Now } Console.WriteLine(Order.ToJson) Console.ReadLine() End Sub

Y este es el resultado final:

{"OrderID":1,"CustomerID":1,"ProductsList":[{"ProductID":1,"ProductName":"BookOn e","Price":10,"inStock":false},{"ProductID":2,"ProductName":"Hotels California", "Price":10,"inStock":false},{"ProductID":3,"ProductName":"Cbr","Price":10,"inSto ck":false},{"ProductID":4,"ProductName":"Mustang","Price":10,"inStock":false},{" ProductID":15,"ProductName":"Anything","Price":10,"inStock":false},{"ProductID": 38,"ProductName":"Monster Truck","Price":10,"inStock":false}],"PurchaseDate":"// Date(1396642206155)//","PaymentMethod":"PayPal"}

Recuerde agregar una referencia a system.web.extension.dll para lograr su objetivo.


Use estas herramientas para generar la clase C #, luego use este código para serializar su objeto

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


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

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


Utilice la biblioteca Json.Net , puede descargarla desde Nuget Packet Manager.

Serialización 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);

Deserialización al objeto:

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


Utilice la clase DataContractJsonSerializer : MSDN1 , MSDN2 .

Mi ejemplo: HERE .

También puede deserializar con seguridad los objetos de una cadena JSON, a diferencia de JavaScriptSerializer . Pero personalmente prefiero Json.NET .


Votaría por JSON Serializer de ServiceStack:

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

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


Wooou Realmente mejor usando un framework 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 del constructor que recibirá una cadena JSON y llenará los campos de la clase.


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


Ya que a todos nos gusta un liners

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

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

Documentación: Serialización y Deserialización de JSON