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
Reference
이 문제에 관하여(C#에서 사용자 지정 형식으로 JSON 읽기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/diegodrf/reading-json-with-custom-formats-in-c-4ihm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)