Question Comment puis-je transformer un objet C # en une chaîne JSON dans .NET?


J'ai des cours comme ceux-ci:

class MyDate
{
    int year, month, day;
}

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

Et j'aimerais transformer un Lad objet dans une chaîne JSON comme ceci:

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

(sans le formatage). j'ai trouvé ce lien, mais il utilise un espace de noms qui n'est pas dans .NET 4. J'ai également entendu parler de JSON.NET, mais leur site semble être en panne pour le moment, et je ne tiens pas à utiliser des fichiers DLL externes. Existe-t-il d'autres options que la création manuelle d'un éditeur de chaîne JSON?


623
2018-06-01 12:59


origine


Réponses:


Vous pouvez utiliser le JavaScriptSerializer class (ajouter une référence à System.Web.Extensions):

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

Un exemple complet:

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

697
2018-06-01 13:05



Puisque nous aimons tous les doublures

... celui-ci dépend du paquet Newtonsoft NuGet, qui est populaire et meilleur que le sérialiseur par défaut.

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

Documentation: JSON sérialisant et désérialisant


660
2017-10-02 12:39



Utilisez le DataContractJsonSerializer classe: MSDN1, MSDN2.

Mon exemple ICI.

Il peut également désérialiser en toute sécurité les objets d'une chaîne JSON, contrairement à JavaScriptSerializer. Mais personnellement, je préfère toujours Json.NET.


51
2018-06-01 13:03



Utilisation Json.Net bibliothèque, vous pouvez le télécharger depuis Nuget Packet Manager.

Sérialisation à 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);

Désérialisation d'un objet:

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

35
2018-06-21 08:15



Wooou! Vraiment mieux en utilisant un framework JSON :)

Voici mon exemple utilisant 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
        }
    }
}

Le test:

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();
        }
    }
}

Le résultat:

{
  "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
    }
  ]
}

Maintenant, je vais implémenter la méthode constructeur qui va recevoir une chaîne JSON et remplit les champs de la classe.


17
2018-02-04 20:07



Si vous êtes dans un contrôleur Web ASP.NET MVC, c'est aussi simple que:

string ladAsJson = Json(Lad);

Je ne peux pas croire que personne n'a mentionné cela.


3
2017-09-16 15:53



Je voterais pour JSON Serializer de ServiceStack:

using ServiceStack.Text

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

C'est aussi le sérialiseur JSON le plus rapide disponible pour .NET: http://www.servicestack.net/benchmarks/


2
2017-10-02 13:39



Utilisez le code ci-dessous pour convertir XML en JSON.

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

2
2018-03-06 09:39



utilisation ces outils pour générer la classe C #

et utilisez ce code

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

pour la sérialisation de votre objet


2
2017-11-21 22:18