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 시리얼 라이저 ( JavaScriptSerializerDataContractJsonSerializer ) 를 사용할 수 없거나 사용하고 싶지 않은 경우 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.