C#에서 사용자 지정 형식으로 JSON 읽기

문제



JSON은 요청에 응답하기 위해 API에서 사용하는 가장 일반적인 유형입니다.
때때로 우리는 C#의 기본 제공 형식을 사용하여 구문 분석할 수 없는 콘텐츠를 수신합니다. 예를 들어, API가 브라질 형식(dd/MM/yyy)과 같은 날짜를 응답하고 앱에서 이 값을 읽어야 한다고 가정합니다.

이 예에서는 아래 JSON을 가정합니다.

{"name":"John","birthDate":"31/12/1990"}


시나리오 준비



먼저 사람을 나타내는 클래스를 만들어야 합니다.

public class Person
{
    [JsonPropertyName("name")]
    public string Name { get; set; }

    [JsonPropertyName("birthDate")]
    public DateTime BirthDate { get; set; }

    public override string ToString()
    {
        return $"Name: {Name} | BirthDate: {BirthDate}";
    }
}


이제 JSON을 나타내는 변수를 만들어야 합니다.

public class Program
{
    public static string jsonExample = "{"
        + "\"name\":\"John\","
        + "\"birthDate\":\"31/12/1990\""
        + "}";

    public static void Main(string[] args)
    {
    }
}


마지막으로 내장JsonSerializer.Deserialize을 사용하여 파서를 생성합니다.

public class Program
{
    public static string jsonExample = "{"
        + "\"name\":\"John\","
        + "\"birthDate\":\"31/12/1990\""
        + "}";
    public static void Main(string[] args)
    {

        var person = JsonSerializer.Deserialize<Person>(jsonExample);
        Console.WriteLine(person);
    }
}


코드 실행



코드를 실행하려고 하면 C#이 사용자 지정 날짜를 유형System.FormatException : The JSON value is not in a supported DateTime format.에 적용하는 방법을 모르기 때문에 DateTime 예외를 알립니다.

해결책



이 문제를 해결하려면 내장 추상 클래스JsonConverter<T>를 사용하여 사용자 지정 json 변환기를 만들어야 합니다.

먼저 JsonConverter<T>에서 상속하는 클래스를 만들어야 합니다. 여기서 T는 예상 결과 유형입니다. 이 경우DateTime .

public class MyCustomJsonConverter : JsonConverter<DateTime>
{

}


그런 다음 상속된 메서드를 구현합니다.

public class MyCustomJsonConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }
}


이제 우리는 두 가지 방법을 구현해야 합니다. 첫 번째는 사용자 정의 json 값을 읽는 것이고 두 번째는 사용자 정의 json 값을 쓰는 것입니다. 이를 위해 값을 읽고 있기 때문에 첫 번째 값만 사용합니다.

시스템은 Utf8JsonReader reader 매개변수를 사용하여 예상되는 json을 전달합니다.
Utf8JsonReader는 구조체이므로 GetString() 유형을 반환하는 string?를 사용하여 값을 가져와야 합니다.

마지막으로 DateTime.ParseExact()를 사용하여 예상대로 날짜 형식을 지정합니다.

public class MyCustomJsonConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var dateTimeFromJson = reader.GetString()!;

        return DateTime.ParseExact(dateTimeFromJson, "dd/MM/yyyy", CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }
}


좋아, 우리는 사용자 지정 변환기를 가지고 있습니다. 이제 속성Person.BirthDate에 이 변환기를 직렬 변환기에 적용해야 합니다.

간단 해. 변환기 유형을 예상하는 속성BirthDate으로 속성JsonConverter()을 장식하기만 하면 됩니다.

public class Person
{
    [JsonPropertyName("name")]
    public string Name { get; set; }

    [JsonPropertyName("birthDate")]
    [JsonConverter(typeof(MyCustomJsonConverter))]
    public DateTime BirthDate { get; set; }

    public override string ToString()
    {
        return $"Name: {Name} | BirthDate: {BirthDate}";
    }
}


코드 실행



사용자 지정 변환기를 만드는 데 필요한 모든 것입니다. 이제 코드를 실행하고 결과를 볼 수 있습니다.
Name: John | BirthDate: 1990-12-31 12:00:00 AM

원천



How to write custom converters for JSON serialization (marshalling) in .NET

학점



사진 제공: James Harrison on Unsplash

좋은 웹페이지 즐겨찾기