방법: JSON 데이터 Serialize 및 Deserialize
JSON(JavaScript Object Notation)은 클라이언트 브라우저 및 AJAX 사용 웹 서비스 간에 소량의 데이터를 신속하게 교환할 수 있는 효율적인 데이터 인코딩 형식입니다.
이 항목에서는 DataContractJsonSerializer를 사용하여 .NET 형식 개체를 JSON 인코딩된 데이터로 serialize한 다음 JSON 형식의 데이터를 다시 .NET 형식의 인스턴스로 deserialize하는 방법을 보여 줍니다. 이 예제에서는 데이터 계약을 사용하여 사용자 정의 Person
형식의 serialization 및 deserialization을 보여 줍니다.
일반적으로 JSON serialization 및 deserialization은 AJAX 사용 끝점을 통해 노출되는 서비스 작업에서 데이터 계약 형식을 사용하는 경우 WCF(Windows Communication Foundation)에 의해 자동으로 처리됩니다. 그러나 일부 경우에서는 JSON 데이터로 직접 작업해야 할 수도 있습니다. 이 항목에서는 그러한 경우를 보여 줍니다.
![]() |
---|
서버에서 보내는 회신의 serialization 동안 오류가 발생하거나 일부 다른 이유로 인해 회신 작업에서 예외를 throw하는 경우 클라이언트를 오류로 반환하지 않을 수 있습니다. |
이 항목은 JSON Serialization 샘플을 기반으로 작성되었습니다.
사용자에 대한 데이터 계약을 정의하려면
DataContractAttribute를 클래스에 연결하고 DataMemberAttribute 특성을 serialize할 멤버에 연결하여
Person
에 대한 데이터 계약을 정의합니다. 데이터 계약에 대한 자세한 내용은 서비스 계약 디자인을 참조하십시오.[DataContract] internal class Person { [DataMember] internal string name; [DataMember] internal int age; }
형식 Person의 인스턴스를 JSON으로 serialize하려면
Person
형식의 인스턴스를 만듭니다.Person p = new Person(); p.name = "John"; p.age = 42;
DataContractJsonSerializer를 사용하여
Person
개체를 메모리 스트림으로 serialize합니다.MemoryStream stream1 = new MemoryStream(); DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
WriteObject 메서드를 사용하여 JSON 데이터를 스트림에 씁니다.
ser.WriteObject(stream1, p);
JSON 출력을 표시합니다.
stream1.Position = 0; StreamReader sr = new StreamReader(stream1); Console.Write("JSON form of Person object: "); Console.WriteLine(sr.ReadToEnd());
JSON에서 형식 Person의 인스턴스를 deserialize하려면
DataContractJsonSerializer의 ReadObject 메서드를 사용하여 JSON 인코딩된 데이터를
Person
의 새 인스턴스로 deserialize합니다.stream1.Position = 0; Person p2 = (Person)ser.ReadObject(stream1);
결과를 표시합니다.
Console.Write("Deserialized back, got name="); Console.Write(p2.name); Console.Write(", age="); Console.WriteLine(p2.age);
예제
![]() |
---|
JSON serializer는 다음 샘플 코드에서처럼 동일한 이름의 여러 멤버를 가진 데이터 계약에 대한 serialization 예외를 throw합니다. |
[DataContract]
public class TestDuplicateDataBase
{
[DataMember]
public int field1 = 123;
}
[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
[DataMember]
public new int field1 = 999;
}