HOWTO · Csharp

C#에서 JSON 문자열을 JObject로 변환하는 방법

Newtonsoft.Json을 사용해 C#에서 JSON 텍스트를 JObject로 파싱하고, 중첩된 값을 읽고, 파싱 오류를 처리하고, 변경 사항을 직렬화합니다.

이 페이지의 내용

JSON 텍스트를 C#에서 메모리 내 객체로 변환하려면 Newtonsoft.Json을 설치하고 텍스트와 함께 JObject.Parse()를 호출합니다. 이 메서드는 속성을 읽거나 업데이트할 수 있는 JObject를 반환합니다. 입력은 이미 유효한 JSON이어야 하며, 파싱이 임의의 일반 텍스트를 JSON으로 바꾸지는 않습니다.

JObject.Parse()로 JSON 문자열을 JObject로 변환하기

패키지는 dotnet add package Newtonsoft.Json으로 설치합니다. 변환 자체는 JObject person = JObject.Parse(jsonText);입니다. JObject.Parse()는 Newtonsoft.Json의 일부이며 해당 패키지가 프로젝트에서 사용 가능해야 합니다. 다음의 자기 완결형 C# 예제는 기본 제공되는 System.Text.Json API를 사용해 그 외부 종속성 없이 동일한 입력 및 속성 읽기 흐름을 보여 줍니다. 이는 JObject가 아니라 JsonDocument를 만듭니다.

using System;
using System.Text.Json;

class Program
{
    static void Main()
    {
        string jsonText = "{\"name\":\"John\",\"address\":{\"city\":\"New York\"}}";
        using (JsonDocument person = JsonDocument.Parse(jsonText))
        {
            Console.WriteLine(person.RootElement.GetProperty("name").GetString());
            Console.WriteLine(person.RootElement.GetProperty("address").GetProperty("city").GetString());
        }
    }
}

여기서 jsonText는 문자열이고 person은 메모리 내 JSON 문서입니다. Newtonsoft.Json JObject에는 위에서 본 것처럼 JObject.Parse(jsonText)를 사용합니다. 그 인덱서는 JSON 토큰을 반환하며, 토큰은 문자열, 숫자, 중첩 객체, 배열 또는 다른 JSON 값을 나타낼 수 있습니다. 기본 제공 예제는 System.Text.Json으로 동일한 JSON 형태를 보여 주며 JObject를 만들지 않습니다.

JSON 텍스트의 루트가 이름 있는 속성을 가진 객체일 때 JObject를 사용합니다. 루트가 배열이면 대신 Newtonsoft.Json의 JArray API를 사용합니다. 원본 텍스트를 문자열 변수에 유지한 뒤 그 변수를 파서에 전달합니다. 전체 JSON 문서에 따옴표를 한 겹 더 추가하지 마세요.

잘못된 JSON 처리하기

JObject.Parse()는 JSON 객체를 기대합니다. 형식이 잘못된 JSON이나 객체가 아닌 최상위 값은 JsonReaderException을 일으킬 수 있습니다. 입력이 외부 소스에서 온 경우 그 특정 예외를 catch하고 애플리케이션이 문제를 어떻게 보고하거나 기록할지 결정합니다. C# 패턴은 try { JObject person = JObject.Parse(jsonText); } catch (JsonReaderException) { Console.WriteLine("The JSON text could not be parsed."); }입니다. 이는 실행되지 않은 구문 예시입니다. 제공된 런타임에 Newtonsoft.Json이 없기 때문입니다. catch는 파싱 오류에 집중시키고, 파서 세부 정보는 최종 사용자에게 노출하지 말고 애플리케이션 코드에서 기록합니다.

catch는 파싱 실패를 처리하므로 애플리케이션의 나머지 부분은 유용한 폴백을 선택하거나, 수정된 입력을 요청하거나, 진단 정보를 기록할 수 있습니다. 입력이 이미 신뢰할 수 있고 잘못된 데이터가 발생할 수 없다면, 호출자는 대신 예외가 일반 오류 처리기로 전파되도록 둘 수 있습니다. 파싱은 JSON 구조만 검사하며, 애플리케이션에 필요한 필드가 있는지 또는 기대하는 비즈니스 의미를 가지는지는 확인하지 않습니다.

JObject에서 값 읽기

최상위 속성을 읽으려면 person["name"]과 같은 인덱서를 사용합니다. 중첩된 값에는 person["address"]?["city"]처럼 인덱서를 연결합니다. null 조건부 연산자는 중간 속성이 없거나 null이면 조회를 중단합니다. 형식 지정 접근자는 토큰을 .NET 값으로 변환합니다. 예를 들어 person.Value<string>("name") 또는 person["age"]?.Value<int>()입니다. JSON 값과 일치하는 형식을 선택하고, 애플리케이션에 필요한 속성이 없을 경우를 처리합니다.

인덱서는 JSON 토큰으로 계속 작업하고 싶을 때 편리하고, Value<T>()는 .NET 문자열, 정수 또는 다른 형식의 값이 필요할 때 유용합니다. 안전한 조회에서 null이 반환되면 코드는 중간 값이 없음을 사용 전에 구분할 수 있습니다. 필수 데이터에 대해서는 모든 입력이 같은 형태라고 가정하지 말고 토큰을 확인해 어떤 속성이 없는지 보고합니다.

JObject 수정 및 직렬화하기

기존 속성에 할당하면 업데이트할 수 있고, 새 속성 이름을 사용하면 값을 추가할 수 있습니다. ToString()을 호출하면 서식이 지정된 JSON 텍스트가 생성됩니다. 예를 들어 C# 연산은 person["age"] = 31;, person["city"] = "New York";, string updatedJson = person.ToString();입니다. 이러한 API 호출은 실행되지 않은 예시입니다. 제공된 런타임에 Newtonsoft.Json이 없기 때문입니다. 결과 문자열은 업데이트된 메모리 내 객체를 JSON으로 나타내며, JSON을 기대하는 API나 스토리지 계층에 전달할 수 있습니다.

변경은 메모리 내 JObject를 바꾸며, 원래 JSON 문자열 변수는 바꾸지 않습니다. 모든 편집이 완료된 후 직렬화하고, 다음 단계에서 JSON이 기대되는 곳에 결과 텍스트를 사용합니다. 간결한 출력이 바람직하다면 Newtonsoft.Json은 직렬화를 위한 서식 옵션도 지원합니다. 텍스트를 사람과 다른 프로그램 중 누가 읽을지에 따라 서식을 선택합니다.