C# 파싱 json
JSON(전체 이름: JavaScript Object Notation)은 경량 데이터 교환 형식입니다. 이는 JavaScript 구문 표준의 하위 집합을 기반으로 합니다. JSON은 다양한 네트워크, 플랫폼 및 프로그램을 통해 쉽게 전송할 수 있는 완전히 언어 독립적인 텍스트 형식입니다. JSON의 구문은 매우 간단하고 사람이 읽고 쓰기 쉽고 기계가 구문 분석하고 생성하기도 쉽습니다.
JSON과 XML의 비교
◆가독성
JSON과 XML의 가독성을 비교하면 XML은 보조 태그를 제공하므로 사람이 읽고 이해하는 데 더 적합합니다.
◆파일 크기 및 전송
XML은 편리한 태그 사용이 가능하므로 파일 크기가 JSON보다 큽니다. 더욱이 JSON은 Javascript에서 유래했기 때문에 자연스러운 주요 전쟁터는 Javascript와 인터넷입니다. 여기서 JSON은 XML이 따라잡을 수 없는 장점을 가지고 있습니다.
JSON 구문
1. JSON 구문은 JavaScript 개체 표기 구문의 하위 집합입니다.
• 데이터는 이름/값 쌍으로 되어 있습니다. 이름은 문자열이며 큰따옴표를 사용하여 표현됩니다. 값은 숫자(정수 또는 부동 소수점), 문자열(큰따옴표 안), 배열(대괄호 안), 개체(중괄호 안), true/false/null일 수 있습니다.
• 데이터는 쉼표로 구분됩니다.
• 중괄호는 객체를 보유합니다. 객체는 배열을 포함한 다양한 데이터를 포함할 수 있습니다.
• 대괄호에는 배열이 포함됩니다. 숫자에는 개체가 포함될 수 있습니다.
예:
{ "employees": [ { "firstName": "Bill", "lastName": "Gates" }, { "firstName": "George", "lastName": "Bush" } ] }
2. JSON에 이스케이프 문자가 포함된 경우 이스케이프해야 합니다. 예를 들어, 파일 경로에 "" 대신 "\"를 사용해야 합니다. 예: { "파일":"C:\a.txt"}.
.NET은 JSON을 작동합니다
JSON 파일을 메모리로 읽어오면 문자열입니다. .NET은 JSON 문자열을 생성하고 구문 분석하여 JSON을 작동합니다. 일반적으로 JSON을 조작하는 방법은 여러 가지가 있습니다.
1. 기존 방법: JSON의 구문 형식을 따르고 JSON 문자열을 직접 조작하는 코드를 작성합니다. 꼭 필요한 경우가 아니면 이 길을 택하고 처음부터 다시 시작하는 사람은 거의 없습니다.
2. 일반적인 방법 [★★★★★]:
이 방법은 오픈 소스 클래스 라이브러리 Newtonsoft.Json(다운로드 주소 http://json.codeplex.com/)을 사용합니다. 다운로드 후 프로젝트에 추가하여 사용하실 수 있습니다. 일반적으로 JObject, JsonReader, JsonWriter를 사용하여 처리할 수 있습니다. 이 방법은 가장 다양하고 유연하며 불편한 부분을 언제든지 수정할 수 있습니다.
(1) JsonReader를 사용하여 Json 문자열 읽기:
string jsonText = @"{""input"" : ""value"", ""output"" : ""result""}"; JsonReader reader = new JsonTextReader(new StringReader(jsonText)); while (reader.Read()) { Console.WriteLine(reader.TokenType + "\t\t" + reader.ValueType + "\t\t" + reader.Value); }
(2) JsonWriter를 사용하여 문자열 쓰기:
StringWriter sw = new StringWriter(); JsonWriter writer = new JsonTextWriter(sw); writer.WriteStartObject(); writer.WritePropertyName("input"); writer.WriteValue("value"); writer.WritePropertyName("output"); writer.WriteValue("result"); writer.WriteEndObject(); writer.Flush(); string jsonText = sw.GetStringBuilder().ToString(); Console.WriteLine(jsonText);
(3) JObject를 사용하여 문자열 읽기 및 쓰기:
JObject jo = JObject.Parse(jsonText); string[] values = jo.Properties().Select(item => item.Value.ToString()).ToArray();
(4) JsonSerializer를 사용하여 객체 읽기 및 쓰기(JsonWriter 및 JsonReader 기반):
배열 데이터
string jsonArrayText1 = "[{'a':'a1','b':'b1'},{'a':'a2','b':'b2'}]"; JArray ja = (JArray)JsonConvert.DeserializeObject(jsonArrayText1); string ja1a = ja[1]["a"].ToString(); //或者 JObject o = (JObject)ja[1]; string oa = o["a"].ToString();
중첩 형식
string jsonText = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}}"; JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText); string zone = jo["beijing"]["zone"].ToString(); string zone_en = jo["beijing"]["zone_en"].ToString();
사용자 정의 클래스 프로젝트
Project p = new Project() { Input = "stone", Output = "gold" }; JsonSerializer serializer = new JsonSerializer(); StringWriter sw = new StringWriter(); serializer.Serialize(new JsonTextWriter(sw), p); Console.WriteLine(sw.GetStringBuilder().ToString()); StringReader sr = new StringReader(@"{""Input"":""stone"", ""Output"":""gold""}"); Project p1 = (Project)serializer.Deserialize(new JsonTextReader(sr), typeof(Project)); Console.WriteLine(p1.Input + "=>" + p1.Output);
위 코드는 다음 Project 클래스 정의를 기반으로 합니다.
class Project { public string Input { get; set; } public string Output { get; set; } }
또한, 위 JsonTextReader 및 기타 클래스를 컴파일할 수 없다면 자체적으로 클래스를 수정하여 교체했다는 의미입니다. 자신만의 관련 클래스로 충분하며 사용에 영향을 미치지 않습니다.
3. 기본 제공 방법: .NET Framework 3.5/4.0에서 제공되는 System.Web.Script.Serialization 네임스페이스 아래의 JavaScriptSerializer 클래스를 사용하여 개체를 직렬화 및 역직렬화합니다. 이는 매우 간단합니다.
Project p = new Project() { Input = "stone", Output = "gold" }; JavaScriptSerializer serializer = new JavaScriptSerializer(); var json = serializer.Serialize(p); Console.WriteLine(json); var p1 = serializer.Deserialize<Project>(json); Console.WriteLine(p1.Input + "=>" + p1.Output); Console.WriteLine(ReferenceEquals(p,p1));
참고: VS2010을 사용하는 경우 현재 프로젝트의 Target Framework를 .Net Framework 4로 변경해야 하며 Client Profile을 사용할 수 없습니다. 물론 이 System.Web.Extensions.dll은 주로 웹에서 사용되기 때문에 콘솔 프로젝트에서 직접 사용하는 것은 리소스 낭비처럼 느껴집니다.
그리고 마지막 문장에서 볼 수 있듯이 직렬화(Serialization)와 역직렬화(Deserialization)는 딥카피의 대표적인 구현 방식입니다.
4. 계약 방법: System.Runtime.Serialization.dll에서 제공하는 DataContractJsonSerializer 또는 JsonReaderWriterFactory를 사용합니다.
Project p = new Project() { Input = "stone", Output = "gold" }; DataContractJsonSerializer serializer = new DataContractJsonSerializer(p.GetType()); string jsonText; using (MemoryStream stream = new MemoryStream()) { serializer.WriteObject(stream, p); jsonText = Encoding.UTF8.GetString(stream.ToArray()); Console.WriteLine(jsonText); } using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText))) { DataContractJsonSerializer serializer1 = new DataContractJsonSerializer(typeof(Project)); Project p1 = (Project)serializer1.ReadObject(ms); Console.WriteLine(p1.Input + "=>" + p1.Output); }
여기서 프로젝트 클래스와 멤버는 관련 속성을 추가해야 한다는 점에 유의해야 합니다.
[DataContract] class Project { [DataMember] public string Input { get; set; } [DataMember] public string Output { get; set; } }
C# json 파일 구문 분석 구현 코드와 관련된 추가 기사를 보려면 다음 항목에 주의하세요. PHP 중국어 웹사이트!