Как преобразовать объект JSON в объект Custom C #? - PullRequest
212 голосов
/ 11 февраля 2010

Есть ли простой способ заполнить мой объект C # объектом JSON, переданным через AJAX?

Это JSON-объект, переданный в C # WEBMETHOD со страницы с использованием JSON.stringify

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

C # WebMetod, который получает объект JSON

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

}

C # Класс, представляющий структуру объекта JSON Object, переданного в WebMethod

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

Ответы [ 13 ]

200 голосов
/ 11 февраля 2010

Хороший способ использовать JSON в C # - JSON.NET

Быстрый запуск и документация API из JSON.NET - Официальный сайт поможет вам в работе.

Пример того, как его использовать:

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);
 }
160 голосов
/ 21 января 2015

Так как мы все любим один код лайнера

Newtonsoft работает быстрее, чем сериализатор java-скриптов. ... это зависит от пакета Newtonsoft NuGet, который популярен и лучше, чем стандартный сериализатор.

если у нас есть класс, используйте ниже.

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

нет класса, тогда используйте динамический

var oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(jsonString);
92 голосов
/ 11 февраля 2010

Чтобы сохранить ваши параметры открытыми, если вы используете .NET 3.5 или более позднюю версию, приведу обобщенный пример, который вы можете использовать прямо из фреймворка, используя Generics. Как уже упоминали другие, если это не просто простые объекты, вы действительно должны использовать 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;
}

Вам понадобится:

using System.Runtime.Serialization;

using System.Runtime.Serialization.Json;
53 голосов
/ 11 февраля 2010

Учитывая ваш пример кода, вам не нужно больше ничего делать.

Если вы передадите эту строку JSON в свой веб-метод, она автоматически проанализирует строку JSON и создаст заполненный объект User в качестве параметра для вашего метода SaveTeam.

Как правило, вы можете использовать класс JavascriptSerializer, как показано ниже, или для большей гибкости используйте любую из различных сред Json (Jayrock JSON хорош) для удобной манипуляции JSON.

 JavaScriptSerializer jss= new JavaScriptSerializer();
 User user = jss.Deserialize<User>(jsonResponse); 
37 голосов
/ 20 августа 2015

Другое действительно простое решение - использование библиотеки Newtonsoft.Json:

User user = JsonConvert.DeserializeObject<User>(jsonString);
31 голосов
/ 03 октября 2013

Следующие 2 примера используют либо

  1. JavaScriptSerializer под System.Web.Script.Serialization Или
  2. Json.Decode под System.Web.Helpers

Пример 1: с использованием 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
        }
    }
}

Использование: Объект JSON для объекта 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; }
    }
}

Пример 2: с использованием 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
        }
    }
}

Использование: Объект JSON для объекта 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; }
    }
}

Этот код требует добавления пространства имен System.Web.Helpers, найденного в,

% ProgramFiles% \ Microsoft ASP.NET \ ASP.NET Web Страницы {VERSION} \ Сборки \ System.Web.Helpers.dll

Или

% ProgramFiles (x86)% \ Microsoft ASP.NET \ ASP.NET Web Страницы {VERSION} \ Сборки \ System.Web.Helpers.dll

Надеюсь, это поможет!

7 голосов
/ 14 июня 2012
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);
        }
    }
}

Больше информации перейдите по следующей ссылке http://ishareidea.blogspot.in/2012/05/json-conversion.html

О DataContractJsonSerializer Class вы можете прочитать здесь .

5 голосов
/ 14 декабря 2011

Использование JavaScriptSerializer () менее строго, чем предлагаемое универсальное решение: public static T Deserialize (string json)

Это может пригодиться при передаче json на сервер, который не совсем соответствует определению объекта, в которое вы пытаетесь преобразовать.

2 голосов
/ 17 июня 2016

По производительности я обнаружил, что сериализатор ServiceStack немного быстрее, чем другие. Это класс JsonSerializer в пространстве имен ServiceStack.Text.

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

ServiceStack доступен через пакет NuGet: https://www.nuget.org/packages/ServiceStack/

1 голос
/ 28 июля 2015

Сериализатор JavaScript: требуется 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);
    }
}

Сериализатор контракта данных: требуется using System.Runtime.Serialization.Json; - Универсальный тип T должен быть сериализуемым подробнее о контракте данных

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...