JSON 객체를 커스텀 C # 객체로 변환하는 방법?


247

C # 객체를 AJAX를 통해 전달 된 JSON 객체로 채우는 쉬운 방법이 있습니까?

JSON을 사용하여 페이지에서 C # WEBMETHOD로 전달 된 JSON 객체입니다.

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

JSON 객체를 수신하는 C # WebMetod

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

}

WebMethod에 전달 된 JSON 객체의 객체 구조를 나타내는 C # 클래스

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

69
json2csharp.com 을 사용하여 C # 클래스를 생성 할 수 있음을 추가하고 싶습니다 . 전체 공개 :이 사이트를 만들었습니다.
JonathanK


@JonathanK 당신은 나의 구세주입니다!
Matheno

답변:


218

C #에서 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);
 }

5
이것은 챔피언처럼 작동하지만 json에 여러 항목이 있고 객체 목록을 만들고 싶다면 어떻게해야합니까?
Djeroen

@ Djeroen : 두 가지 방법이 있습니다. 항목이 그룹화되지 않은 경우 문자열을 분할하는 방법을 찾으려고 루프에서 프로세스를 반복하십시오. 그것들이 그룹화되어 있다면 객체의 객체를
만드십시오

1
나는 다른 답변에서 언급 된 하나의 라이너를 선호한다. IMHO.
RayLoveless

그렇습니다. 이것은 좋은 접근 방법이 아닙니다. DeserializeObject를 사용하는 아래 방법은 훨씬 깨끗합니다.
Andrew

209

우리는 모두 하나의 라이너 코드를 좋아하기 때문에

Newtonsoft는 자바 스크립트 시리얼 라이저보다 빠릅니다. ... 이것은 Newtonsoft NuGet 패키지에 의존하는데, 이것은 기본 시리얼 라이저보다 널리 사용됩니다.

우리가 수업을 가지고 있다면 아래에서 사용하십시오.

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

수업이 없으면 동적을 사용하십시오.

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

95

.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;

트윗 담아 가기 좋은 지적입니다. 예, 포장해야합니다. 이것에 대해 가늠하면서 JSON.NET을 사용하십시오!
Jammin

2
DataContractJsonSerializer 클래스가 보이지 않으면 솔루션에서 References를 마우스 오른쪽 단추로 클릭하여 System.Runtime.Serialization에 대한 참조를 추가해야합니다 .NET 탭을 선택하고 System.Runtime.Serialization
DanKodi를

1
이 시나리오가 깨지는 시나리오. JSON 객체가 작은 따옴표로 속성을 나타내는 경우이 함수는 실패합니다. 예 : { '제목': '이메일 링 : 웹 사용자 활동 Log11', 'EmbedAsImage': true}를 구문 분석 할 수 없었지만 { "제목": "이메일 링 : 웹 사용자 활동 Log11", "EmbedAsImage"를 구문 분석 할 수있었습니다. : true}
dreamerkumar

또한 간단한 클래스를 DataContract 및 DataMember 특성으로 장식해야했습니다. 그것 없이는 파싱하지 않을 것입니다.
dreamerkumar

Vishal과 달리 POCO 클래스는 JSON.NET에 대한 종속성을 피하기 때문에 +1 완벽하게 작동했습니다.
Dunc

54

코드 샘플이 주어지면 다른 작업을 수행 할 필요가 없습니다.

해당 JSON 문자열을 웹 메소드에 전달하면 JSON 문자열이 자동으로 구문 분석되고 채워진 User 오브젝트가 SaveTeam 메소드의 매개 변수로 작성됩니다.

일반적 JavascriptSerializer으로 아래 클래스를 사용 하거나 유연성을 높이기 위해 JSON 조작을 쉽게하기 위해 다양한 Json 프레임 워크 (Jayrock JSON이 좋습니다)를 사용하십시오.

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

1
나는 당신이 ienumerable 유형을 사용해야한다고 생각합니다 (
따라서이

하위 뷰 모델을 포함하는 경우 직렬화를 해제하는 방법
SrinivasNaidu

1
찾고있는 사람들은 System.Web.Extensions어셈블리 를 참조하고 using System.Web.Script.Serialization를 얻기 위해를 추가 JavaScriptSerializer해야하지만 일단 그렇게하면 json문자열을 c # 콘크리트 클래스로 직렬화 해제하는 가장 깨끗한 방법처럼 보입니다 .
Serj Sagan

41

또 다른 정말 간단한 솔루션은 Newtonsoft.Json 라이브러리를 사용하는 것입니다.

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

그러나 User 객체가 속성에 다른 JSon 데이터를 가지고 있으면 실패 할 것입니다.
gumuruh

@ gumuruh 나는 당신의 진술을 이해하지 못했다고 생각합니다. 복잡한 객체의 마녀 속성이 다른 복잡한 객체 인 경우 Json String에 데이터가 올바르게있는 한 해당 객체도 변환됩니다.
다니엘

33

다음 두 예제는 다음 중 하나를 사용합니다.

  1. System.Web.Script.Serialization 아래의 JavaScriptSerializer 또는
  2. System.Web.Helpers 아래의 Json.Decode

예 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 객체에서 사용자 정의 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 객체에서 사용자 정의 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 웹 페이지 {VERSION} \ Assemblies \ System.Web.Helpers.dll

또는

% ProgramFiles (x86) % \ Microsoft ASP.NET \ ASP.NET 웹 페이지 {VERSION} \ Assemblies \ System.Web.Helpers.dll

도움이 되었기를 바랍니다!


이것은 매우 좋은 대답이지만, 까다로운 점은 dynamic유형을 사용하면 진정한 유형 검사를 할 수 없다는 것입니다. 예를 들어, JSON에 "Name" : "Ahmed"C # 코드에서 "Name"을 잘못 입력하면 런타임 오류 (블레)입니다.
Jess

감사! 예 1의 경우 System.Web.Extensions.dll
Valamas

1
훌륭한 답변, json.net v6.0.6에서도 동적 타이핑이 가능합니다!
stackuser83

7
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

JavaScriptSerializer () 사용은 제공되는 일반적인 솔루션보다 덜 엄격합니다. public static T Deserialize (string json)

변환하려는 객체 정의와 정확히 일치하지 않는 json을 서버에 전달할 때 유용 할 수 있습니다.



1

JSON.Net이 최선의 방법이지만 객체의 모양과 순환 종속성이 있는지 여부에 따라 JavaScriptSerializer 또는 DataContractSerializer를 사용할 수 있습니다.



1

JavaScript Serializer : 필요 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);
        }
    }
}

0

그냥 객체로 보내지 않고.

액세스 가능한 공개 특성 클래스를 작성하고 데이터를 웹 메소드로 보냅니다.

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

데이터를 보내려면 ajax 호출에서 동일한 매개 변수 이름을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.