Как преобразовать объект JSON в пользовательский объект С#?

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

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

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

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

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

}

Класс С#, который представляет структуру объекта 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; }
}

Ответ 1

Хороший способ использовать JSON в С# - это 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);
 }

Ответ 2

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

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

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

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

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

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

Ответ 3

Чтобы ваши параметры открывались, если вы используете .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;

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

В следующих двух примерах используется либо

  • JavaScriptSerializer в System.Web.Script.Serialization Или
  • 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 для пользовательского объекта С#

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 для пользовательского объекта С#

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

Это очень удобный инструмент, который создает объектные модели С# * из JSON: http://json2csharp.com

Ответ 8

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 вы можете прочитать здесь.

Ответ 9

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

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

Ответ 11

JSON.Net - ваш лучший выбор, но, в зависимости от формы объектов и наличия круговых зависимостей, вы можете использовать JavaScriptSerializer или DataContractSerializer.

Ответ 13

Сериализатор 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);
        }
    }
}

Ответ 14

Также этот сайт может помочь вам создавать классы из ввода JSON. Это действительно отличная работа, генерирующая классы JSON TO CSHARP CLASSES GENERATOR

Ответ 15

Вместо отправки только как объекта.

Создать открытый класс доступных свойств и отправить данные в Web-метод.

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

использовать те же имена параметров в ajax-вызове для отправки данных.