NJsonSchema 패키지를 이용해 JsonSchema를 C# 클래스로 추출 시 "anyOf" 키워드가 포함된 경우 정상 변환되지 않는 것 같습니다.

VS 2022, net48 환경에서 NJsonSchema / v11.0.0.0 버전을 사용해 JsonSchema(.json) 파일을 C# 클래스로 추출하는 작업을 하고 있습니다.

하지만 제가 변환하고자 하는 JsonSchema 파일을 변환 시, anyOf 키워드가 포함된 부분에 대해서는 정확하게 변환되지 않아 혹시 해당 문제를 해결하신 분이 있으신지 자문을 구하고자 합니다.

변환하고자 하는 JsonSchema의 스펙은 아래와 같습니다.
https://json-schema.org/draft/2020-12/schema

NJsonSchema에서 사용 중인 JsonSchema의 스펙은 아래와 같습니다.
http://json-schema.org/draft-04/schema#

NJsonSchema에서 사용 중인 JsonSchema 스펙이 이전버전으로 두 버전간 문법적, 기능적 차이가 있는 듯 합니다.


위의 PR을 참고하여, 일부 anyOf 케이스에 대해서 변환이 정상적으로 이루어지는 점을 확인하였지만, 여전히 정상적으로 변환하는 데에 실패하는 케이스가 있습니다.

기존에 실패했었지만 위의 PR을 참고하여 수정했을 때 정상 변환되는 Sample JsonSchema (.json)

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "Test.json",
    "type": "object",
    "properties": {
        "response": {
            "anyOf": [
                {
                    "type": "object",
                    "properties": {
                        "name": {
                            "type": "string",
                            "description": "이름"
                        }
                    },
                    "required": [
                        "name"
                    ]
                },
                {
                    "type": "object",
                    "properties": {
                        "message": {
                            "type": "string"
                        },
                        "stack": {
                            "type": "string"
                        }
                    },
                    "required": [
                        "message"
                    ]
                }
            ],
            "description": "응답"
        }
    },
    "required": [
        "response"
    ],
    "title": "Test"
}

위의 케이스에서 anyOf 부분이 C# 클래스로 정상적으로 변환됩니다.
하지만 아래 두 가지 케이스는 변환이 여전히 되지 않습니다.

위의 PR 바탕으로도 해결이 안되는 anyOf 케이스 1

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "Test.json",
    "type": "object",
    "properties": {
        "response": {
            "anyOf": [
                {
                    "type": "object",
                    "properties": {
                        "uesrId": {
                            "$ref": "ObjectId.json",
                            "description": "유저"
                        },
                        "familyMemberId": {
                            "anyOf": [
                                {
                                    "$ref": "ObjectId.json"
                                },
                                {
                                    "type": "null"
                                }
                            ],
                            "description": "가족"
                        }
                    },
                    "required": [
                        "uesrId",
                        "familyMemberId"
                    ]
                },
                {
                    "type": "object",
                    "properties": {
                        "message": {
                            "type": "string"
                        },
                        "stack": {
                            "type": "string"
                        }
                    },
                    "required": [
                        "message"
                    ]
                }
            ],
            "description": "응답"
        }
    },
    "required": [
        "response"
    ],
    "title": "Test"
}

anyOf Array 내 첫 번째 object는 변환이 되지 않고, 두 번째 object는 정상적으로 변환 됩니다.

ObjectId.json

{
    "type": "string",
    "title": "ObjectId",
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "ObjectId.json"
}

위의 PR 바탕으로도 해결이 안되는 anyOf 케이스 2

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "Test.json",
    "type": "object",
    "properties": {
        "operation": {
            "anyOf": [
                {
                    "type": "string",
                    "const": "NEW_1"
                },
                {
                    "type": "string",
                    "const": "NEW_2"
                },
                {
                    "type": "string",
                    "const": "NEW_3"
                }
            ],
            "description": "동작"
        }
    },
    "required": [
        "operation"
    ],
    "description": "상태",
    "title": "Test"
}

해당 anyOf 케이스도 정상적으로 변환되지 않네요…

혹시 NJsonSchema를 사용해서 복잡한 스키마 관계로 정의된 JsonSchema 파일을
C# 클래스로 변환해보신 분들이 있으시다면 도움 부탁드립니다…!

1 Like