.NET Framework
JSON 직렬화
수색…
비고
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;
}