C #에서 JSON 문자열을 만드는 방법


238

방금 XmlWriter를 사용하여 HTTP 응답으로 다시 보낼 XML을 만들었습니다. JSON 문자열을 작성하는 방법 나는 stringbuilder를 사용하여 JSON 문자열을 작성하고 응답을 JSON으로 형식화한다고 가정합니까?


답변:


249

당신은 사용할 수 JavaScriptSerializer 클래스를 확인, 이 기사를 유용한 확장 방법을 구축 할 수 있습니다.

기사의 코드 :

namespace ExtensionMethods
{
    public static class JSONHelper
    {
        public static string ToJSON(this object obj)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(obj);
        }

        public static string ToJSON(this object obj, int recursionDepth)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            serializer.RecursionLimit = recursionDepth;
            return serializer.Serialize(obj);
        }
    }
}

용법:

using ExtensionMethods;

...

List<Person> people = new List<Person>{
                   new Person{ID = 1, FirstName = "Scott", LastName = "Gurthie"},
                   new Person{ID = 2, FirstName = "Bill", LastName = "Gates"}
                   };


string jsonString = people.ToJSON();

예, JSON 텍스트를 먼저 구성하는 방법을 알아 내려고 노력했습니다. 감사합니다
— PositiveGuy

.NET 3.5를 사용하지 않으면 어떻게 될까요? da ** it
— PositiveGuy

2
JavaScriptSerializer는 .NET 2.0에서 사용하려는 경우 ASP.NET Ajax 1.0의 일부입니다.
— Joe Chung

2
여전히 사용할 수 있습니다. ASP.NET 2.0 AJAX 확장 1.0의 일부 : asp.net/AJAX/Documentation/Live/mref/…
— Naren

우리 프로젝트는 VS 2008에서 열 수 있습니다 ... 그래서 어느 시점에서 변환되었습니다. 이제 기존 코드베이스 내에서 .NET 3.5를 사용할 수 있습니까?
— PositiveGuy

366

Newtonsoft.Json 을 사용하면 훨씬 쉬워집니다.

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };

string json = JsonConvert.SerializeObject(product);

설명서 : JSON 직렬화 및 역 직렬화


8
MS는 이제 VS MVC4 프로젝트 템플릿에서 NewtonSoft를 표준으로 제공합니다.
— Chris F Carroll

45
필요한 경우 익명 객체를 직렬화 할 수도 있습니다 string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
— Matt Beckman

9
. 내가 "얻을 @MattBeckman 잘못된 익명 형식 멤버 선언자 익명 형식 멤버는 멤버 할당, 간단한 이름이나 멤버 액세스로 선언해야하지 않나요. "PropertyA"수 PropertyA?
— 요나

따라서 간단한 json을 생성하려면 클래스와 객체를 구현해야합니다! 고정 배열이 아닌 중첩 배열 요소를 상상해보십시오. 나는 왜 그렇게 많은 열정이 공중에 있는지 알 수 없습니다!
— Vassilis

6
@MattBeckman @Jonah는 string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });큰 따옴표없이PropertyA.
— Jose


17

Newtonsoft.Json 및 Newtonsoft.Json.Linq 라이브러리 사용을 단순화 합니다.

        //Create my object
        var my_jsondata = new
        {
            Host = @"sftp.myhost.gr",
            UserName = "my_username",
            Password = "my_password",
            SourceDir = "/export/zip/mypath/",
            FileName = "my_file.zip"
        };

        //Tranform it to Json object
        string json_data = JsonConvert.SerializeObject(my_jsondata);

        //Print the Json object
        Console.WriteLine(json_data);

        //Parse the json object
        JObject json_object = JObject.Parse(json_data);

        //Print the parsed Json object
        Console.WriteLine((string)json_object["Host"]);
        Console.WriteLine((string)json_object["UserName"]);
        Console.WriteLine((string)json_object["Password"]);
        Console.WriteLine((string)json_object["SourceDir"]);
        Console.WriteLine((string)json_object["FileName"]);

간단하고 편리합니다. 감사.
— QMaster

13

이 코드 조각은 .NET 3.5의 System.Runtime.Serialization.Json의 DataContractJsonSerializer를 사용합니다.

public static string ToJson<T>(/* this */ T value, Encoding encoding)
{
    var serializer = new DataContractJsonSerializer(typeof(T));

    using (var stream = new MemoryStream())
    {
        using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, encoding))
        {
            serializer.WriteObject(writer, value);
        }

        return encoding.GetString(stream.ToArray());
    }
}

3
따라서 ...이 스 니펫이 실제로 작동하도록 'this'참조의 주석을 해제하십시오. 확장 방법을 사용해 본 적이 없다면 분명하지 않을 수 있습니다.
— Dan Esparza


7

내 ServiceStack JsonSerializer 는 현재 가장 빠른 .NET JSON 직렬 변환기 입니다. DataContracts, 모든 POCO 유형, 인터페이스, 익명 유형을 포함한 후기 바인딩 된 객체 등의 직렬화를 지원합니다.

기본 예

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = JsonSerializer.SerializeToString(customer);
var fromJson = JsonSerializer.DeserializeFromString<Customer>(json); 

참고 : 다른 JSON 직렬 변환기보다 최대 40x-100x 느리기 때문에 벤치 마크에서 제외해야하므로 성능이 중요하지 않은 경우 Microsoft JavaScriptSerializer 만 사용하십시오 .


객체 목록을 사용하여 JsonSerializer.SerializeToString을 시도했는데 빈 json을 반환했습니다. "[{}, {}]" pastebin.com/yEw57L3T 다음은 SerializeToString을 호출하기 전에 객체가 어떻게 보이는지 보여줍니다. i.imgur.com/dYIE7J1.png 여기에 가장 많이 투표 된 답변은 효과가 있었지만 예상했던 결과를 반환했습니다. pastebin.com/aAtB3Gxu
— Matthew Lock

가장 빠른 .NET JSON serializer 링크가 종료되었습니다.

6

복잡한 결과가 필요한 경우 (임베디드) 고유 한 구조를 만듭니다.

class templateRequest
{
    public String[] registration_ids;
    public Data data;
    public class Data
    {
        public String message;
        public String tickerText;
        public String contentTitle;
        public Data(String message, String tickerText, string contentTitle)
        {
            this.message = message;
            this.tickerText = tickerText;
            this.contentTitle = contentTitle;
        }                
    };
}

그런 다음 호출하여 JSON 문자열을 얻을 수 있습니다

List<String> ids = new List<string>() { "id1", "id2" };
templateRequest request = new templeteRequest();
request.registration_ids = ids.ToArray();
request.data = new templateRequest.Data("Your message", "Your ticker", "Your content");

string json = new JavaScriptSerializer().Serialize(request);

결과는 다음과 같습니다.

json = "{\"registration_ids\":[\"id1\",\"id2\"],\"data\":{\"message\":\"Your message\",\"tickerText\":\"Your ticket\",\"contentTitle\":\"Your content\"}}"

그것이 도움이되기를 바랍니다!


5

두 개의 내장 JSON 시리얼 라이저 ( JavaScriptSerializer 및 DataContractJsonSerializer ) 를 사용할 수 없거나 사용하고 싶지 않은 경우 JsonExSerializer 라이브러리를 사용해 볼 수 있습니다 -여러 프로젝트에서 사용하며 아주 잘 작동합니다.


1
JavaScriptSerializer를 시도했지만 null 객체와 잘 작동하지 않습니다.
— Luke101

1
@ Luke101 : 정확히 어떻게? 나는 매일 사용하고 문제가 없었기 때문에 솔직히 궁금합니다! (아무것도 아니고, 나는 문제가 발생하지 않았기 때문에 정말로 궁금하다)
— Tamas Czinege

2

JSON을 통해 데이터를 웹 페이지에 제공하는 웹 서비스를 작성하려는 경우 ASP.NET Ajax 툴킷 사용을 고려하십시오.

http://www.asp.net/learn/ajax/tutorial-05-cs.aspx

웹 서비스를 통해 제공되는 객체를 자동으로 json으로 변환하고 연결하는 데 사용할 수있는 프록시 클래스를 만듭니다.


JSON 문자열을 반환하는 .ashx에 대한 호출 일뿐입니다. 먼저 문자열을 형성하는 방법을 알아 내려고 노력하고 있습니다 .StringBuilder를 사용합니까? 두 번째로, 어떻게 직렬화 하는가. XML을 반환 할 때 응답의 내용 유형을 설정하면됩니다. context.Response.ContentType = "text / xml"
— PositiveGuy

1

DataContractJSONSerializer는 XmlSerializer를 같은 쉬운 당신을 위해 모든 것을 할 것입니다. 웹 앱에서 이것을 사용하는 것은 간단합니다. WCF를 사용하는 경우 속성과 함께 사용을 지정할 수 있습니다. DataContractSerializer 제품군도 매우 빠릅니다.


1

시리얼 라이저가 전혀 필요하지 않다는 것을 알았습니다. 객체를 List로 반환하는 경우 예를 들어 보겠습니다.

asmx에서 전달한 변수를 사용하여 데이터를 얻습니다.

// return data
[WebMethod(CacheDuration = 180)]
public List<latlon> GetData(int id) 
{
    var data = from p in db.property 
               where p.id == id 
               select new latlon
               {
                   lat = p.lat,
                   lon = p.lon

               };
    return data.ToList();
}

public class latlon
{
    public string lat { get; set; }
    public string lon { get; set; }
}

그런 다음 jquery를 사용하여 해당 변수를 전달하여 서비스에 액세스합니다.

// get latlon
function getlatlon(propertyid) {
var mydata;

$.ajax({
    url: "getData.asmx/GetLatLon",
    type: "POST",
    data: "{'id': '" + propertyid + "'}",
    async: false,
    contentType: "application/json;",
    dataType: "json",
    success: function (data, textStatus, jqXHR) { //
        mydata = data;
    },
    error: function (xmlHttpRequest, textStatus, errorThrown) {
        console.log(xmlHttpRequest.responseText);
        console.log(textStatus);
        console.log(errorThrown);
    }
});
return mydata;
}

// call the function with your data
latlondata = getlatlon(id);

그리고 우리는 우리의 응답을 얻습니다.

{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}

url : "getData.asmx / GetLatLon", 서버 측 코드에서 GetLatLon 메소드가 필요합니다. 그러나 없습니다.
— Lali

1

사용 인코딩

JSON 배열에 대한 간단한 객체 EncodeJsObjectArray ()

public class dummyObject
{
    public string fake { get; set; }
    public int id { get; set; }

    public dummyObject()
    {
        fake = "dummy";
        id = 5;
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append('[');
        sb.Append(id);
        sb.Append(',');
        sb.Append(JSONEncoders.EncodeJsString(fake));
        sb.Append(']');

        return sb.ToString();
    }
}

dummyObject[] dummys = new dummyObject[2];
dummys[0] = new dummyObject();
dummys[1] = new dummyObject();

dummys[0].fake = "mike";
dummys[0].id = 29;

string result = JSONEncoders.EncodeJsObjectArray(dummys);

결과 : [[29, "mike"], [5, "dummy"]]

예쁜 사용법

Pretty Print JSON 배열 PrettyPrintJson () 문자열 확장 방법

string input = "[14,4,[14,\"data\"],[[5,\"10.186.122.15\"],[6,\"10.186.122.16\"]]]";
string result = input.PrettyPrintJson();

결과는 다음과 같습니다

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