web-dev-qa-db-fra.com

Comment convertir un objet JSON en objet Custom C #?

Existe-t-il un moyen simple de remplir mon objet C # avec l’objet JSON transmis via AJAX?

C'est l'objet JSON transmis à C # WEBMETHOD à partir de la page à l'aide de 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)
{

}

Classe C # qui représente la structure d'objet de l'objet JSON transmis au WebMethod

public class User
{
    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}
216
MHop

Un bon moyen d'utiliser JSON en C # est d'utiliser JSON.NET

Quick Starts & API Documentation à partir de JSON.NET - Site officiel vous aider à l'utiliser.

Un 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);
 }
203
AndreyAkinshin

Puisque nous aimons tous le code à une ligne

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

si nous avons la classe alors utilisez ci-dessous.

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

pas de classe alors utilisez dynamique

var oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(jsonString);
167
MSTdev

Pour que vos options restent ouvertes, si vous utilisez .NET 3.5 ou une version ultérieure, voici un exemple récapitulatif que vous pouvez utiliser directement à partir du framework en utilisant Generics. Comme d'autres l'ont mentionné, si ce ne sont pas de simples objets, vous devez 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;
}

Tu auras besoin:

using System.Runtime.Serialization;

using System.Runtime.Serialization.Json;
93
Jammin

Compte tenu de votre exemple de code, vous ne devriez rien faire d’autre.

Si vous transmettez cette chaîne JSON à votre méthode Web, il analysera automatiquement la chaîne JSON et créera un objet Utilisateur rempli en tant que paramètre de votre méthode SaveTeam.

En règle générale, vous pouvez utiliser la classe JavascriptSerializer comme ci-dessous ou, pour plus de flexibilité, utiliser l’un des divers frameworks Json (le JSON de Jayrock est bon) pour une manipulation facile du JSON.

 JavaScriptSerializer jss= new JavaScriptSerializer();
 User user = jss.Deserialize<User>(jsonResponse); 
53
womp

Une autre solution très simple utilise la bibliothèque Newtonsoft.Json:

User user = JsonConvert.DeserializeObject<User>(jsonString);
38
Daniel

Les 2 exemples suivants utilisent soit

  1. JavaScriptSerializer sous System.Web.Script.Serialization Ou
  2. Json.Decode sous System.Web.Helpers

Exemple 1: en utilisant System.Web.Script.Serialization

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

sage: Objet JSON en objet Custom 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 System.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
        }
    }
}

sage: Objet JSON en objet Custom 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 espace de noms System.Web.Helpers trouvé dans,

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

Ou

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

J'espère que cela t'aides!

32
user677607
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 sur le lien suivant http://ishareidea.blogspot.in/2012/05/json-conversion.html

À propos de DataContractJsonSerializer Class vous pouvez lire ici .

7
Syam Developer

L'utilisation de JavaScriptSerializer () est moins stricte que la solution générique proposée: public statique T Deserialize (string json)

Cela peut s'avérer utile lorsque vous transmettez au serveur JSON qui ne correspond pas exactement à la définition de l'objet que vous essayez de convertir.

5
Ioannis Suarez

En termes de performances, j'ai trouvé le sérialiseur du ServiceStack un peu plus rapide que les autres. C'est la classe JsonSerializer dans l'espace de noms ServiceStack.Text.

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

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

2
akazemis

JSON.Net est votre meilleur choix mais, en fonction de la forme des objets et de l'existence de dépendances circulaires, vous pouvez utiliser JavaScriptSerializer ou DataContractSerializer.

1
Sky Sanders

Sérialiseur JavaScript: requiert 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);
    }
}

Sérialiseur de contrat de données: requiert using System.Runtime.Serialization.Json; - Le type générique T doit être sérialisable plus de détails 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
BTE

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

1
ΩmegaMan

Plutôt que d'envoyer comme un simple objet.

Créez une classe publique de propriétés accessible et envoyez les données au 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