Comment convertir objet JSON en Custom C# object?

y a-t-il un moyen facile de peupler mon objet C# avec l'objet JSON passé via AJAX?

/ / C'est L'objet JSON passé à C# WEBMETHOD à partir de la page utilisant JSON.stringify

{
    "user": {
        "name": "asdf",
        "teamname": "b",
        "email": "c",
        "players": ["1", "2"]
    }
}

//C# WebMetod Qui reçoit l'Objet JSON

[WebMethod]
public static void SaveTeam(Object user)
{

}

//C# Class qui représente la structure de l'objet JSON passé à la WebMethod

public class User
{
    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}
185
demandé sur Alex 2010-02-11 21:30:37

13 réponses

une bonne façon d'utiliser JSON en C# est avec JSON.NET

Quick Starts & API Documentation from JSON.NET - le site officiel vous aider à travailler avec elle.

exemple d'utilisation:

public class User
{
    public User(string json)
    {
        JObject jObject = JObject.Parse(json);
        JToken jUser = jObject["user"];
        name = (string) jUser["name"];
        teamname = (string) jUser["teamname"];
        email = (string) jUser["email"];
        players = jUser["players"].ToArray();
    }

    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}

// Use
private void Run()
{
    string json = @"{""user"":{""name"":""asdf"",""teamname"":""b"",""email"":""c"",""players"":[""1"",""2""]}}";
    User user = new User(json);

    Console.WriteLine("Name : " + user.name);
    Console.WriteLine("Teamname : " + user.teamname);
    Console.WriteLine("Email : " + user.email);
    Console.WriteLine("Players:");

    foreach (var player in user.players)
        Console.WriteLine(player);
 }
176
répondu AndreyAkinshin 2015-05-15 21:35:55

puisque nous aimons tous un liners code

Newtonsoft est plus rapide que Java script serializer. ... celui-ci dépend du paquet NuGet Newtonsoft, qui est populaire et meilleur que le serializer par défaut.

si nous avons la classe alors utiliser ci-dessous.

Mycustomclassname oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<Mycustomclassname>(Json Object);

aucune classe puis utilisez dynamique

var oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Json Object);
116
répondu MSTdev 2015-01-21 07:35:58

pour garder vos options ouvertes, si vous utilisez .NET 3.5 ou plus tard, voici un exemple que vous pouvez utiliser directement depuis le framework en utilisant Generics. Comme d'autres l'ont mentionné, si ce n'est pas seulement des objets simples, vous devriez vraiment utiliser JSON.net.

public static string Serialize<T>(T obj)
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    MemoryStream ms = new MemoryStream();
    serializer.WriteObject(ms, obj);
    string retVal = Encoding.UTF8.GetString(ms.ToArray());
    return retVal;
}

public static T Deserialize<T>(string json)
{
    T obj = Activator.CreateInstance<T>();
    MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    obj = (T)serializer.ReadObject(ms);
    ms.Close();
    return obj;
}

Vous aurez besoin de:

using System.Runtime.Serialization;

using System.Runtime.Serialization.Json;
88
répondu Jammin 2012-06-21 20:41:20

étant donné votre exemple de code, vous ne devriez pas avoir à faire autre chose.

si vous passez cette chaîne JSON à votre méthode web, elle analysera automatiquement la chaîne JSON et créera un objet utilisateur peuplé comme paramètre pour votre méthode SaveTeam.

en général, vous pouvez utiliser la classe JavascriptSerializer comme ci-dessous, ou pour plus de flexibilité, utiliser l'un des différents cadres Json là-bas (Jayrock JSON est un bon) pour facile JSON manipulation.

 JavaScriptSerializer jss= new JavaScriptSerializer();
 User user = jss.Deserialize<User>(jsonResponse); 
48
répondu womp 2010-02-11 18:38:11

une autre Solution très simple est D'utiliser la bibliothèque Newtonsoft.Json:

User user = JsonConvert.DeserializeObject<User>(jsonString);
34
répondu Daniel 2015-08-19 22:29:45

les deux exemples suivants utilisent l'un ou l'autre

  1. JavaScriptSerializer sous système.Web.Script.Sérialisation Ou
  2. Json.Décoder sous le système .Web.Helpers

exemple 1: en utilisant le système.Web.Script.La sérialisation

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Script.Serialization;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void Test()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            dynamic jsonObject = serializer.Deserialize<dynamic>(json);

            dynamic x = jsonObject["user"]; // result is Dictionary<string,object> user with fields name, teamname, email and players with their values
            x = jsonObject["user"]["name"]; // result is asdf
            x = jsonObject["user"]["players"]; // result is object[] players with its values
        }
    }
}

Utilisation: objet JSON à la Coutume objet C#

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Script.Serialization;
using System.Linq;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void TestJavaScriptSerializer()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            User user = new User(json);
            Console.WriteLine("Name : " + user.name);
            Console.WriteLine("Teamname : " + user.teamname);
            Console.WriteLine("Email : " + user.email);
            Console.WriteLine("Players:");
            foreach (var player in user.players)
                Console.WriteLine(player);
        }
    }

    public class User {
        public User(string json) {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            var jsonObject = serializer.Deserialize<dynamic>(json);
            name = (string)jsonObject["user"]["name"];
            teamname = (string)jsonObject["user"]["teamname"];
            email = (string)jsonObject["user"]["email"];
            players = jsonObject["user"]["players"];
        }

        public string name { get; set; }
        public string teamname { get; set; }
        public string email { get; set; }
        public Array players { get; set; }
    }
}

exemple 2: en utilisant le système.Web.Helpers

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Helpers;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void TestJsonDecode()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            dynamic jsonObject = Json.Decode(json);

            dynamic x = jsonObject.user; // result is dynamic json object user with fields name, teamname, email and players with their values
            x = jsonObject.user.name; // result is asdf
            x = jsonObject.user.players; // result is dynamic json array players with its values
        }
    }
}

Utilisation: objet JSON à la Coutume objet C#

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Helpers;
using System.Linq;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void TestJsonDecode()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            User user = new User(json);
            Console.WriteLine("Name : " + user.name);
            Console.WriteLine("Teamname : " + user.teamname);
            Console.WriteLine("Email : " + user.email);
            Console.WriteLine("Players:");
            foreach (var player in user.players)
                Console.WriteLine(player);
        }
    }

    public class User {
        public User(string json) {
            var jsonObject = Json.Decode(json);
            name = (string)jsonObject.user.name;
            teamname = (string)jsonObject.user.teamname;
            email = (string)jsonObject.user.email;
            players = (DynamicJsonArray) jsonObject.user.players;
        }

        public string name { get; set; }
        public string teamname { get; set; }
        public string email { get; set; }
        public Array players { get; set; }
    }
}

ce code nécessite l'ajout d'un système.Web.Les aides de l'espace de noms trouvés dans la,

%ProgramFiles% \ Microsoft ASP.NET\ASP.NET Web Pages{VERSION} \ Assemblies\System.Web.Helper.dll

ou

%ProgramFiles (x86)% \ Microsoft ASP.NET\ASP.NET Web Pages{VERSION} \ Assemblies\System.Web.Helper.dll

Espérons que cette aide!

30
répondu 2013-10-03 21:54:53
public static class Utilities
{
    public static T Deserialize<T>(string jsonString)
    {
        using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
        {    
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            return (T)serializer.ReadObject(ms);
        }
    }
}

plus d'informations allez au lien suivant http://ishareidea.blogspot.in/2012/05/json-conversion.html

à propos de DataContractJsonSerializer Class vous pouvez lire ici .

6
répondu Syam Developer 2013-04-16 16:42:39

utilisant JavaScriptSerializer () est moins strict que la solution générique offerte : public static t Deserialize (string json)

qui pourrait s'avérer pratique en passant json au serveur qui ne correspond pas exactement à la définition D'objet vers laquelle vous essayez de convertir.

5
répondu Ioannis Suarez 2011-12-14 17:56:46

du point de vue des performances, j'ai trouvé le serializer de la sacoche un peu plus rapidement que les autres. C'est la classe JsonSerializer de ServiceStack.Texte de l'espace de noms.

https://github.com/ServiceStack/ServiceStack.Text

ServiceStack est disponible via le paquet NuGet: https://www.nuget.org/packages/ServiceStack /

2
répondu akazemis 2016-06-17 07:19:17

JSON.Net est votre meilleur pari mais, selon la forme des objets et s'il y a des dépendances circulaires, vous pouvez utiliser JavaScriptSerializer ou DataContractSerializer.

1
répondu Sky Sanders 2010-02-11 18:38:36

le générateur de classe JSON C# sur codeplex génère des classes qui fonctionnent bien avec NewtonSoftJS.

1
répondu ΩmegaMan 2013-04-25 16:45:37

Serializer JavaScript: requires using System.Web.Script.Serialization;

public class JavaScriptSerializerDeSerializer<T>
{
    private readonly JavaScriptSerializer serializer;

    public JavaScriptSerializerDeSerializer()
    {
        this.serializer = new JavaScriptSerializer();
    }

    public string Serialize(T t)
    {
        return this.serializer.Serialize(t);
    }

    public T Deseralize(string stringObject)
    {
        return this.serializer.Deserialize<T>(stringObject);
    }
}

Contrat de Données Sérialiseur: nécessite using System.Runtime.Serialization.Json; - Le type générique T devrait être sérialisable plus sur le contrat de données

public class JsonSerializerDeserializer<T> where T : class
{
    private readonly DataContractJsonSerializer jsonSerializer;

    public JsonSerializerDeserializer()
    {
        this.jsonSerializer = new DataContractJsonSerializer(typeof(T));
    }

    public string Serialize(T t)
    {
        using (var memoryStream = new MemoryStream())
        {
            this.jsonSerializer.WriteObject(memoryStream, t);
            memoryStream.Position = 0;
            using (var sr = new StreamReader(memoryStream))
            {
                return sr.ReadToEnd();
            }
        }
    }

    public T Deserialize(string objectString)
    {
        using (var ms = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes((objectString))))
        {
            return (T)this.jsonSerializer.ReadObject(ms);
        }
    }
}
1
répondu BTE 2015-07-28 09:17:14

plutôt que d'envoyer un simple objet .

Créer une classe de propriétés qui est accessible et envoyer les données à l'Webmethod.

[WebMethod]
public static void SaveTeam(useSomeClassHere user)
{
}

utilisez les mêmes noms de paramètres dans l'appel ajax pour envoyer des données.

0
répondu Praveen Kumar Rejeti 2017-10-20 12:47:13