Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

Newtonsoft.Json으로 XML과 JSON 상호 변환하기: SerializeXmlNode와 DeserializeXmlNode 활용법

C# 개발에서 XML과 JSON은 가장 널리 사용되는 데이터 형식입니다. 다행히 Json.NET(Newtonsoft.Json) 라이브러리는 XmlNodeConverter를 통해 두 형식 간의 변환을 손쉽게 지원합니다.

변환 과정에서 요소(Element), 속성(Attribute), 텍스트, 주석(Comment), 문자 데이터(CDATA), 처리 명령(Processing Instruction), 네임스페이스, 그리고 XML 선언부까지 모두 그대로 보존되므로, 기존 문서 구조를 잃지 않고 안전하게 변환할 수 있다는 점이 큰 장점입니다.

1. SerializeXmlNode — XML을 JSON으로 변환

JsonConvert 클래스는 XML과 JSON 사이를 변환하는 두 가지 헬퍼 메서드를 제공합니다. 첫 번째는 SerializeXmlNode()입니다. 이 메서드는 XmlNode 객체를 입력받아 JSON 텍스트로 직렬화합니다.

XML의 속성은 JSON에서 @ 접두사가 붙은 키로 표현됩니다.

2. DeserializeXmlNode — JSON을 XML로 변환

두 번째 메서드는 DeserializeXmlNode()입니다. 이 메서드는 반대로 JSON 텍스트를 입력받아 XmlNode 객체로 역직렬화합니다.

JSON에서 @version, ?xml처럼 특수 접두사가 붙은 키는 각각 XML 속성과 처리 명령(XML 선언)으로 매핑됩니다.

예제 1: XML → JSON 변환

static void Main(string[] args) {
   string xml = @"<person id='1'><name>Alan</name><url>https://www.google1.com</url><role>Admin1</role></person>";
   XmlDocument doc = new XmlDocument();
   doc.LoadXml(xml);
   string json = JsonConvert.SerializeXmlNode(doc);
   Console.WriteLine(json);
   Console.ReadLine();
}

실행 결과

{"person":{"@id":"1","name":"Alan","url":"https://www.google1.com","role":"Admin1"}}

위 결과에서 볼 수 있듯이, XML의 id 속성이 @id라는 JSON 키로 변환된 것을 확인할 수 있습니다.

예제 2: JSON → XML 변환

static void Main(string[] args) {
   string json = @"{
      '?xml': {
         '@version': '1.0',
         '@standalone': 'no'
      },
      'root': {
         'person': [
            {
           '@id': '1',
           'name': 'Alan',
           'url': 'https://www.google1.com'
            },
            {
           '@id': '2',
           'name': 'Louis',
           'url': 'https://www.yahoo1.com'
            }
         ]
      }
   }";
   XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json);
   Console.WriteLine(doc.OuterXml);
   Console.ReadLine();
}

입력 JSON 구조

'?xml': {
   '@version': '1.0',
   '@standalone': 'no'
},
'root': {
   'person': [
      {
      '@id': '1',
      'name': 'Alan',
      'url': 'https://www.google1.com'
      },
      {
      '@id': '2',
      'name': 'Louis',
      'url': 'https://www.yahoo1.com'
      }
   ]
}

JSON 내의 ?xml 키가 XML 선언부(<?xml version="1.0" standalone="no"?>)로 변환되며, 여러 개의 person 객체는 반복되는 XML 요소로 생성됩니다.

마무리 및 참고 사항

Json.NET의 XML-JSON 변환 기능을 활용하면 별도의 커스텀 파서를 작성할 필요 없이 몇 줄의 코드만으로 데이터 형식을 자유롭게 전환할 수 있습니다. 다만 다음 사항을 유의하세요.

  • JSON을 XML로 변환할 때는 루트 요소가 하나여야 합니다. 필요하다면 DeserializeXmlNode(json, "root")처럼 루트 이름을 지정할 수 있습니다.
  • @ 접두사는 속성, #text는 텍스트 노드, #cdata-section은 CDATA를 의미합니다.
  • NuGet에서 Newtonsoft.Json 패키지를 설치한 후 using Newtonsoft.Json; 네임스페이스를 추가해야 사용할 수 있습니다.