web-dev-qa-db-fra.com

Comment 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 objet Lad en une chaîne JSON comme celle-ci:

{
    "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 aussi entendu parler de JSON.NET , mais leur site semble être en panne pour le moment, et je ne suis pas enthousiaste. sur l’utilisation de fichiers DLL externes. Existe-t-il d'autres options que la création manuelle d'un graveur de chaîne JSON?

720
Hui

Vous pouvez utiliser la classe JavaScriptSerializer (ajoutez 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);
    }
}
764
Darin Dimitrov

Depuis que nous aimons tous un liners

... 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: Serializing et Deserializing JSON

798
willsteel

Utilisez Json.Net library, vous pouvez le télécharger à partir de Nuget Packet Manager.

Sérialisation sur 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 en objet:

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );
56
Gokulan P H

Utilisez la classe DataContractJsonSerializer: MSDN1 , MSDN2 .

Mon exemple: ICI .

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

53
Edgar

Wooou! Vraiment mieux en utilisant un framework JSON :)

Voici mon exemple d'utilisation de 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 du constructeur qui reçoit une chaîne JSON et remplit les champs de la classe.

21
Jean J. Michel

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'en a parlé.

4
micahhoover

Si elles ne sont pas très grandes, exportez-les probablement sous le format Json .

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

Vous pouvez y parvenir en utilisant Newtonsoft.json. Installez Newtonsoft.json à partir de Nuget. et alors:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);
3
Waleed Naveed

Utilisez this tools pour générer la classe C #, puis utilisez ce code pour sérialiser votre objet.

 var json = new JavaScriptSerializer().Serialize(obj);
2
Artem Polischuk

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

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

Aussi facile que cela fonctionne pour les objets dynamiques (objet type): 

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

Je voterais pour le sérialiseur JSON de ServiceStack:

using ServiceStack.Text

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

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

1
James

Il y a cet utilitaire vraiment astucieux ici: http://csharp2json.io/

0
jallen

Sérialiseur

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

Objet

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

La mise en oeuvre

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

Sortie

{
  "AppSettings": {
    "DebugMode": false
  }
}
0
C0r3yh