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

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

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

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

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

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

}

//C# класс, представляющий структуру объекта JSON объекта, переданного в 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 ответов


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

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

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

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

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

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

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

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

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

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

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

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

еще одно очень простое решение-использование библиотеки Newtonsoft.В JSON:

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

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

  1. JavaScriptSerializer под

Пример 1: использование системы.Сеть.Скрипт.Сериализация

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 для пользовательского 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: использование системы.Сеть.Помощники!--5-->

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

этот код требует добавления системы.Сеть.Helpers пространство имен найдено в,

%ProgramFiles%\Microsoft ASP.NET\ASP.NET полотно Страницы{версия}\сборки\система.Сеть.Прислуга.dll файлы

или

%ProgramFiles (x86)%\Microsoft Веб ASP.NET\ASP.NET Страницы{версия}\сборки\система.Сеть.Прислуга.dll файлы

надеюсь, что это помогает!


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 вы можете узнать здесь.


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

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


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

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

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


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


на генератор классов JSON C# на codeplex генерирует классы, которые хорошо работают с NewtonSoftJS.


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

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

создайте общедоступный класс свойств, который доступен, и отправьте данные в Webmethod.

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

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