>백엔드 개발 >C#.Net 튜토리얼 >json 파일 구문 분석을 위한 C# 구현 코드

json 파일 구문 분석을 위한 C# 구현 코드

高洛峰
高洛峰원래의
2017-01-18 09:54:171405검색

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 중국어 웹사이트!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.