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, WriteValue, 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.WriteValue("Intel");
jsonWriter.WritePropertyName("PSU");
jsonWriter.WriteValue("500W");
jsonWriter.WritePropertyName("Drives");
jsonWriter.WriteStartArray();jsonWriter.WriteValue("DVD read/writer");
jsonWriter.WriteComment("(broken)");
jsonWriter.WriteValue("500 gigabyte hard drive");
jsonWriter.WriteValue("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 ^^*