CAFE

ASP.NET WEBFORM

Json.NET 4.0 Release 7 알아보기

작성자심재운|작성시간12.01.27|조회수519 목록 댓글 5


json.net 4.0 은  .net framework 4.0 에서 운영되어 지며, 높은 성능을 자랑하고 있습니다.

현재 릴리스 7 이며 지속적으로 버그 fix 및 기능을 개선하고 있습니다.





1. Serializing (객체 -> json 문자열 추출하기)


두개의 클래스의 인스턴스에 값을 할당받아서 이를 제네릭 배열에 담아서 Serializing 작업을 한 후, json 형태의 문자열 값을 얻어 낼수 있습니다. 여기서 주의 사항은 두개의 클래스에 대한 속성명이 동일해야 합니다.


Product p1 = new Product
  {
    Name = "Product 1",
    Price = 99.95m,
    ExpiryDate = new DateTime(2000, 12, 29, 0, 0, 0, DateTimeKind.Utc),
  };
Product p2 = new Product
{
  Name = "Product 2",
  Price = 12.50m,
  ExpiryDate = new DateTime(2009, 7, 31, 0, 0, 0, DateTimeKind.Utc),
};
 
List<Product> products = new List<Product>();
products.Add(p1);
products.Add(p2);
 
string json = JsonConvert.SerializeObject(products, Formatting.Indented);



json 문자열 변수에 할당된 json 형태의 데이터 값 출력은 아래와 같습니다.


//[
//  {
//    "Name": "Product 1",
//    "ExpiryDate": "\/Date(978048000000)\/",
//    "Price": 99.95,
//    "Sizes": null
//  },
//  {
//    "Name": "Product 2",
//    "ExpiryDate": "\/Date(1248998400000)\/",
//    "Price": 12.50,
//    "Sizes": null
//  }

//]




2. Deserializing (json -> 객체)


json 형태의 문자열 값을 Deserializing 을 통해서 자동적으로 제네릭에 객체값으로 변환하여 얻을 수 있습니다.


string json = @"[
  {
    ""Name"": ""Product 1"",
    ""ExpiryDate"": ""\/Date(978048000000)\/"",
    ""Price"": 99.95,
    ""Sizes"": null
  },
  {
    ""Name"": ""Product 2"",
    ""ExpiryDate"": ""\/Date(1248998400000)\/"",
    ""Price"": 12.50,
    ""Sizes"": null
  }
]";
 
List<Product> products = JsonConvert.DeserializeObject<List<Product>>(json);
 
Console.WriteLine(products.Count);
// 출력 : 2
 
Product p1 = products[0];
 
Console.WriteLine(p1.Name);

// 출력 : Product 1



3. json 문자열 -> dictionary 제네릭에 key, value 형태로 담기.


Dictionary 제네릭 객체에 값을 할당할때 주의 사항은 key 값이 중복되지 않아야 한다는 사실입니다. (key1, key2..)

중복 시, 오류가 발생됩니다. 값은 key명을 통해서 얻을 수 있습니다.


string json = @"{""key1"":""value1"",""key2"":""value2""}";
 
Dictionary<string, string> values = 
            JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
 
Console.WriteLine(values.Count);
// 2
 
Console.WriteLine(values["key1"]);

// value1





4. linq to json (linq - > json)


json 형태의 문자열을 JObject 클래스의 Parse 메소드를 통해 객체에 할당하고, SelectToken 메소드를 통해서 데이터를 추출합니다. SelectToken 메소드의 파라미터 값에 linq 형태처럼 구현하여 데이터를 아래처럼 추출가능합니다.



JObject o = JObject.Parse(@"{
  ""Stores"": [
    ""Lambton Quay"",
    ""Willis Street""
  ],
  ""Manufacturers"": [
    {
      ""Name"": ""Acme Co"",
      ""Products"": [
        {
          ""Name"": ""Anvil"",
          ""Price"": 50
        }
      ]
    },
    {
      ""Name"": ""Contoso"",
      ""Products"": [
        {
          ""Name"": ""Elbow Grease"",
          ""Price"": 99.95
        },
        {
          ""Name"": ""Headlight Fluid"",
          ""Price"": 4
        }
      ]
    }
  ]
}");
 
string name = (string)o.SelectToken("Manufacturers[0].Name");
// 출력 : Acme Co
 
decimal productPrice = (decimal)o.SelectToken("Manufacturers[0].Products[0].Price");
// 출력 : 50
 
string productName = (string)o.SelectToken("Manufacturers[1].Products[0].Name");

// 출력 : Elbow Grease



아래는 SelectToken 메소드를 통하여 linq 구문으로 이를 select 메소드를 통해서 다중의 문자열값을 제네릭의 list<> 를 통해 값을 얻을 수 있습니다.


IList<string> storeNames = o.SelectToken("Stores").Select(s => (string)s).ToList();
// Lambton Quay
// Willis Street
 
IList<string> firstProductNames = 
 o["Manufacturers"].Select(m => (string)m.SelectToken("Products[1].Name")).ToList();
// null
// Headlight Fluid
 
decimal totalPrice = 
 o["Manufacturers"].Sum(m => (decimal)m.SelectToken("Products[0].Price"));

// 149.95



5. JsonTextReader and JsonTextWriter 로 json 읽고, 쓰기


JsonTextWriter 클래스는 json 문자열을 쓰고, JsonTextReader 클래스는 json 문자열을 읽도록 제공해 주는 기능을 내포하고 있습니다.

WriteStartObject, WritePropertyName, WriteVal‎ue, WriteStartArray 와 같은 속성을 통해서 각종 json 형태의 태그들을 기능별로 생성해 줍니다.


StringBuilder sb = new StringBuilder();

StringWriter sw = new StringWriter(sb);
 
using (JsonWriter jsonWriter = new JsonTextWriter(sw))
{
  jsonWriter.Formatting = Formatting.Indented;
 
  jsonWriter.WriteStartObject();
  jsonWriter.WritePropertyName("CPU");
  jsonWriter.WriteVal‎ue("Intel");
  jsonWriter.WritePropertyName("PSU");
  jsonWriter.WriteVal‎ue("500W");
  jsonWriter.WritePropertyName("Drives");
  jsonWriter.WriteStartArray();
  jsonWriter.WriteVal‎ue("DVD read/writer");
  jsonWriter.WriteComment("(broken)");
  jsonWriter.WriteVal‎ue("500 gigabyte hard drive");
  jsonWriter.WriteVal‎ue("200 gigabype hard drive");
  jsonWriter.WriteEnd();
  jsonWriter.WriteEndObject();
}
 
// {
//   "CPU": "Intel",
//   "PSU": "500W",
//   "Drives": [
//     "DVD read/writer"
//     /*(broken)*/,
//     "500 gigabyte hard drive",
//     "200 gigabype hard drive"
//   ]
// }



6. JTokenReader and JTokenWriter


이는 LINQ to JSON 을 읽고, 쓰기 기능을 내포하고 있습니다. 해당 JObject 클래스의 인스턴스에 값을 할당하고, 이를 linq to json 형태로 읽기도 하고, 쓰기도 합니다.


JObject o = new JObject(
  new JProperty("Name", "John Smith"),
  new JProperty("BirthDate", new DateTime(1983, 3, 20))
  );
 
JsonSerializer serializer = new JsonSerializer();
Person p = (Person)serializer.Deserialize(new JTokenReader(o), typeof(Person));
 
Console.WriteLine(p.Name);

// John Smith



7. Json <-> Xml



json 형태와 xml 형태를 필요때마다 서로 변환하는 기능도 제공합니다.

아래는 xml 형태를 json 으로 변환하는 작업을 하며, SerializeXmlNode 메소드를 통해서 이를 처리합니다.


string xml = @"<?xml version=""1.0"" standalone=""no""?>
<root>
  <person id=""1"">
  <name>Alan</name>
  <url>http://www.google.com</url>
  </person>
  <person id=""2"">
  <name>Louis</name>
  <url>http://www.yahoo.com</url>
  </person>
</root>";
 
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
 
string jsonText = JsonConvert.SerializeXmlNode(doc);
//{
//  "?xml": {
//    "@version": "1.0",
//    "@standalone": "no"
//  },
//  "root": {
//    "person": [
//      {
//        "@id": "1",
//        "name": "Alan",
//        "url": "http://www.google.com"
//      },
//      {
//        "@id": "2",
//        "name": "Louis",
//        "url": "http://www.yahoo.com"
//      }
//    ]
//  }

//}



이번에는 json 형태의 값을 xml 로 추출하는 방법입니다. DeserializeXmlNode 메소드를 통해서 xml 값을 얻을 수 있습니다.


string json = @"{
  ""?xml"": {
    ""@version"": ""1.0"",
    ""@standalone"": ""no""
  },
  ""root"": {
    ""person"": [
      {
        ""@id"": ""1"",
        ""name"": ""Alan"",
        ""url"": ""http://www.google.com""
      },
      {
        ""@id"": ""2"",
        ""name"": ""Louis"",
        ""url"": ""http://www.yahoo.com""
      }
    ]
  }
}";
 
XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json);
// <?xml version="1.0" standalone="no"?>
// <root>
//   <person id="1">
//   <name>Alan</name>
//   <url>http://www.google.com</url>
//   </person>
//   <person id="2">
//   <name>Louis</name>
//   <url>http://www.yahoo.com</url>
//   </person>

// </root>



더 많은 api 를 제공하고 있으며, 아래 경로를 참고하시면 도움말과 각각의 네임스페이스 별 클래스 및 속성 기능들을 자세히 보실 수 있습니다.






감사합니다.






다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자웹도사™ | 작성시간 12.01.27 오.. 활용도가 높겠는걸..
  • 작성자junnyt | 작성시간 12.02.02 좋은 정보 감사 드립니다. 궁금한것이 .net 4.0 에도 json 관련 라이브러리가 있지 않나요..?
    .net 4.0 에서 제공되는 것과 어떤 차이가 있는지 물어봐도 될까요..? ^^;
  • 답댓글 작성자심재운 작성자 본인 여부 작성자 | 작성시간 12.02.02 성능면에서 json.net 이 월등하고 많은 함수를
    제공합니다. 도움말 링크 걸려 있으니 확인해 보시기 바랍니다 ^^*
  • 작성자김형태 | 작성시간 12.03.27 좋은정보감사
  • 답댓글 작성자심재운 작성자 본인 여부 작성자 | 작성시간 12.03.27 ^^*
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼