수색…


비고

JavaScriptSerializer 대 Json.NET

JavaScriptSerializer 클래스 는 .NET 3.5에서 도입되었으며 AJAX 지원 응용 프로그램의 .NET 비동기 통신 레이어에서 내부적으로 사용됩니다. 관리되는 코드에서 JSON을 사용하여 작업 할 수 있습니다.

JavaScriptSerializer 클래스가 있음에도 불구하고 직렬화 및 비 직렬화를 위해 오픈 소스 Json.NET 라이브러리 를 사용하는 것이 좋습니다. Json.NET는 더 나은 성능과 사용자 정의 클래스에 맵핑 JSON (사용자 정의에 대한 친숙한 인터페이스를 제공 JavaScriptConverter 객체 와 동일한 달성하기 위해 필요한 것 JavaScriptSerializer ).

System.Web.Script.Serialization.JavaScriptSerializer를 사용하여 비 직렬화

JavaScriptSerializer.Deserialize<T>(input) 메서드는 JavaScriptSerializer 기본적으로 지원하는 기본 매핑을 사용하여 유효한 JSON 문자열을 지정된 유형 <T> 의 개체로 역 직렬화하려고 시도합니다.

using System.Collections;
using System.Web.Script.Serialization;

// ...

string rawJSON = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";

JavaScriptSerializer JSS = new JavaScriptSerializer(); 
Dictionary<string, object> parsedObj = JSS.Deserialize<Dictionary<string, object>>(rawJSON);

string name = parsedObj["Name"].toString();
ArrayList numbers = (ArrayList)parsedObj["Numbers"]

참고 : JavaScriptSerializer 개체는 .NET 버전 3.5에 도입되었습니다.

Json.NET을 사용한 직렬화 해제

internal class Sequence{
    public string Name;
    public List<int> Numbers;
}    

// ...

string rawJSON = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";

Sequence sequence = JsonConvert.DeserializeObject<Sequence>(rawJSON);

자세한 내용은 Json.NET 공식 사이트를 참조하십시오.

참고 : Json.NET은 .NET 버전 2 이상을 지원합니다.

Json.NET을 사용한 직렬화

[JsonObject("person")]
public class Person
{
    [JsonProperty("name")]
    public string PersonName { get; set; }
    [JsonProperty("age")]
    public int PersonAge { get; set; }
    [JsonIgnore]
    public string Address { get; set; }
}

Person person = new Person { PersonName = "Andrius", PersonAge = 99, Address = "Some address" };
string rawJson = JsonConvert.SerializeObject(person);

Console.WriteLine(rawJson); // {"name":"Andrius","age":99}

속성 (및 클래스)이 결과 json 문자열에서 모양을 변경하거나 json 문자열 (JsonIgnore)에서 속성을 제거하기 위해 속성으로 장식 될 수있는 방법에 유의하십시오.

Json.NET 직렬화 속성에 대한 자세한 내용은 여기를 참조하십시오 .

C #에서는 공용 식별자가 규칙에 따라 PascalCase 로 작성됩니다. JSON에서 컨벤션은 모든 이름에 camelCase 를 사용하는 것입니다. 계약 리졸버를 사용하여 계약 리졸버를 변환 할 수 있습니다.

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    [JsonIgnore]
    public string Address { get; set; }
}

public void ToJson() {
    Person person = new Person { Name = "Andrius", Age = 99, Address = "Some address" };
    var resolver = new CamelCasePropertyNamesContractResolver();
    var settings = new JsonSerializerSettings { ContractResolver = resolver };
    string json = JsonConvert.SerializeObject(person, settings);

    Console.WriteLine(json); // {"name":"Andrius","age":99}
}

직렬화 - Newtonsoft.Json을 사용한 직렬화 해제

다른 헬퍼와는 달리이 클래스는 정적 클래스 헬퍼를 사용하여 직렬화 및 비 직렬화를 수행하므로 다른 것들보다 사용하기가 쉽습니다.

using Newtonsoft.Json;

var rawJSON      = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";
var fibo         = JsonConvert.DeserializeObject<Dictionary<string, object>>(rawJSON);
var rawJSON2     = JsonConvert.SerializeObject(fibo);

동적 바인딩

Newtonsoft의 Json.NET을 사용하면 유형을 명시 적으로 만들 필요없이 동적으로 (ExpandoObject / 동적 객체를 사용하여) json을 바인딩 할 수 있습니다.

직렬화

dynamic jsonObject = new ExpandoObject();
jsonObject.Title   = "Merchent of Venice";
jsonObject.Author  = "William Shakespeare";
Console.WriteLine(JsonConvert.SerializeObject(jsonObject));

비 직렬화

var rawJson = "{\"Name\":\"Fibonacci Sequence\",\"Numbers\":[0, 1, 1, 2, 3, 5, 8, 13]}";
dynamic parsedJson = JObject.Parse(rawJson);
Console.WriteLine("Name: " + parsedJson.Name);
Console.WriteLine("Name: " + parsedJson.Numbers.Length);

rawJson 객체의 키가 동적 객체의 멤버 변수로 바뀌 었음을 알 수 있습니다.

이는 애플리케이션이 다양한 형식의 JSON을 수용 / 생성 할 수있는 경우에 유용합니다. 그러나 직렬화 / 역 직렬화의 결과로 생성 된 동적 객체 또는 Json 문자열에 대해 추가 수준의 유효성 검사를 사용하는 것이 좋습니다.

JsonSerializerSettings로 Json.NET을 사용한 직렬화

이 serializer에는 Null 값 처리와 같이 기본 .net json serializer에없는 멋진 기능이 있습니다. JsonSerializerSettings 를 만들어야합니다.

public static string Serialize(T obj)
{
   string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
   return result;
}

.net의 또 다른 심각한 시리얼 라이저 문제는 자체 참조 루프입니다. 코스에 등록한 학생의 경우 인스턴스에 코스 속성이 있으며 코스에는 참조 루프를 생성하는 List<Student> 를 의미하는 학생 컬렉션이 있습니다. JsonSerializerSettings 이것을 처리 할 수 ​​있습니다 :

public static string Serialize(T obj)
{
   string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore});
   return result;
}

다음과 같이 다양한 직렬화 옵션을 지정할 수 있습니다.

public static string Serialize(T obj)
{
   string result = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, ReferenceLoopHandling = ReferenceLoopHandling.Ignore});
   return result;
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow