Utf8 Json의 Dictionary 열쇠는 Custom Formtter 사용

10329 단어 .NETC#JSONutf8jsontech

개시하다


.NET가 JSON을 처리할 때 Utf8Json의 프로그램 라이브러리가 있습니다.
  • Utf8Json
  • 나는 이 고장 사람이다.NET용 JSON 라이브러리도 System.Text.Json가 있지만 참조형을 사용할 때 기본 설정이 필요하기 때문에 가끔은Utf8Json을 사용합니다.
    여기에는 Utf8Json을 사용할 때 Dictionary 객체의 키에 끼워 넣는 것이 아니라 자체 제작한 등급과 구조체를 사용하는 방법을 소개한다.

    대상의 자제류


    이런 Immutable 기본 구조기가 없는 학급과 구조체는 Dictionary의 열쇠를 이용한다.
        public readonly struct EmployeeId
        {
            public EmployeeId(int intValue)
            {
                IntValue = intValue;
            }
    
            public int IntValue { get; }
        }
    

    Custom Formater 만들기


    Utf8 Json에서는 JSON이 독립형 클래스에 있는 시리아를 명확히 지정하려면 IJsonFormitter를 시행해야 하고, Dictionary 열쇠를 사용하려면 IJsonFormitter에 IOb jectProperty NameFormitter를 추가로 시행해야 한다.
    EmployeeId의 예에서 int의 속성만 현지화하고 싶기 때문에Formoter는 다음과 같이 실시한다.
    이때 JSON 규격에 따라 Lenovo 배열(Dictionary)의 키는 문자열이어야 하므로 다른 사용 위치와 다른 로컬화·분류화를 활용할 수 있도록 서로 다른 인터페이스, IOb ject Property NameFormeter를 사용해 변환한다.
    public sealed class EmployeeIdFormatter : IJsonFormatter<EmployeeId>, IObjectPropertyNameFormatter<EmployeeId>
    {
        public void Serialize(ref JsonWriter writer, EmployeeId value, IJsonFormatterResolver formatterResolver)
        {
            writer.WriteInt32(value.IntValue);
        }
    
        public EmployeeId Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver)
        {
            return new EmployeeId(reader.ReadInt32());
        }
    
        public void SerializeToPropertyName(ref JsonWriter writer, EmployeeId value, IJsonFormatterResolver formatterResolver)
        {
            writer.WriteInt32(value.IntValue);
        }
    
        public EmployeeId DeserializeFromPropertyName(ref JsonReader reader, IJsonFormatterResolver formatterResolver)
        {
            return new EmployeeId(reader.ReadString());
        }
    }
    

    Custom Formater 활용


    이러한 Formoter를 활용하려면 다음과 같이 표준 Formoter에 추가합니다.
    CompositeResolver.RegisterAndSetAsDefault(
        new IJsonFormatter[] {new EmployeeIdFormatter()},
        new[] {StandardResolver.Default});
    
    var employeeNames = new Dictionary<EmployeeId, string>
    {
        [new EmployeeId(0)] = "Steve Jobs",
        [new EmployeeId(1)] = "Bill Gates"
    };
    var jsonBytes = Utf8Json.JsonSerializer.Serialize(employeeNames);
    
    이렇게 하면 다음과 같은 JSON을 얻을 수 있다.
    {0:"Steve Jobs",1:"Bill Gates"}
    
    이상.

    좋은 웹페이지 즐겨찾기