programing

다른 유형의 항목 배열에 대한 JSON 스키마 수정

showcode 2023. 3. 31. 23:02
반응형

다른 유형의 항목 배열에 대한 JSON 스키마 수정

JSON 아이템이 정렬되어 있지 않습니다.https://datatracker.ietf.org/doc/html/draft-zyp-json-schema-03#section-5.5 사양에 따르면 다음 json 스키마는 어레이 내의 개체가 해당 순서로 표시되는지 여부만 검증합니다.순서를 지정할 필요는 없습니다.순서나 개체 수에 관계없이 어레이 내의 개체를 검증하기만 하면 됩니다.명세서를 보면 어떻게 하는지 이해할 수 없을 것 같아요.

"transactions" : {
    "type" : "array",
    "items" : [
        {
            "type" : "object",
            "properties" : {
                "type" : {
                    "type" : "string",
                    "enum" : ["BUILD", "REASSIGN"]
                }
            }
        },
        {
            "type" : "object",
            "properties" : {
                "type" : {
                    "type" : "string",
                    "enum" : ["BREAK"]
                }
            }
        }
    ]
}

JSON 스키마 구글그룹에서도 같은 질문을 했더니 바로 답변이 왔습니다.사용자 fge가 여기에 자신의 답변을 게시할 것을 요청했습니다.

안녕하세요.

현재 사양은 초안 v3가 아닌 초안 v4입니다.구체적으로는, 검증의 사양은 다음과 같습니다.

https://datatracker.ietf.org/doc/html/draft-fge-json-schema-validation-00

웹사이트가 최신이 아닌데 왜 그런지...풀 리퀘스트를 제출하겠습니다.

드래프트 v4에서는 다음을 사용할 수 있습니다.

{
    "type": "array",
    "items": {
        "oneOf": [
            {"first": [ "schema", "here" ] }, 
            {"other": [ "schema": "here" ] }
        ]
    }  
}

예를 들어, 항목이 문자열 또는 정수일 수 있는 배열의 스키마입니다(단, 보다 간단한 방법으로 쓸 수 있습니다).

{
    "type": "array",
    "items": {
        "oneOf": [
            {"type": "string"},
            {"type": "integer"}
        ]
    }
}

이게 정답이에요.수정된 스키마에는 다음이 포함됩니다.

"transactions" : {
    "type" : "array",
    "items" : {
        "oneOf" : [
            {
                "type" : "object",
                "properties" : {
                    "type" : {
                        "type" : "string",
                        "enum" : ["BUILD", "REASSIGN"]
                    }
                }
            },
            {
               "type" : "object",
               "properties" : {
                 "type" : {
                   "type" : "string",
                   "enum" : ["BREAK"]
                  }
               }
            }
        ]
    }
}

나도 꽤 오랫동안 이걸 조사해왔어.하지만 효과적인 해결책을 찾지 못했습니다.예를 들어 스키마가 1개만 있으면 정상적으로 동작합니다.

"transactions" : {
          "type" : "array",
          "items" : 
          {
            "type" : "object",
            "properties" : {
              "type" : {
                "type" : "string",
                "enum" : ["BREAK"]
              },
          }
}

그런 다음 어레이 대괄호를 건너뛰고 개체를 사용합니다.하지만 지금 하고 있는 일을 하고 싶다면 확실한 답은 없는 것 같다.지금까지 알아낸 것은 이것뿐입니다.http://the-long-dark-tech-time.blogspot.se/2012/12/using-json-schema-with-array-of-mixed.html

드래프트 3 스키마를 고수하고 있는 사람을 위해서.초안 4의 "AnyOf"에 해당하는 "Type" 키워드가 있습니다.

이 때문에,

{
    "fooBar" : {
        "type" : "array",
        "items" : {
            "type" : [{
                    "type" : "object",
                    "properties" : {
                        "foo" : {                           
                            "type" : "string"
                        }
                    }
                }, {
                    "type" : "object",
                    "properties" : {
                        "bar" : {
                            "type" : "string"
                        }
                    }
                }
            ]
        }
    }
}

사용자 Vdex에 대한 응답으로, 이는 동일하지 않습니다.작성한 내용은 어레이 요소가 어레이 내에서 특정 순서로 발생함을 의미합니다.

스키마 검증기를 사용하는 경우 올바르게 구현될 수 있습니다.

이 스키마의 경우:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "array",
  "items": [
    {
      "type": "boolean"
    },
    {
      "type": "number"
    },
    {
      "type": "string"
    }
  ]
}

이 JSON은 다음과 같이 검증됩니다.

[
  true,
  5,
  "a",
  "6",
  "a",
  5.2
]

하지만 이건 아니야

[
  5,
  true,
  "a",
  "6",
  "a",
  5.2
]

따라서 "One Of"와 같은 키워드와는 목적이 전혀 다릅니다.

이 경우 배열의 첫 번째 요소는 특정 형식을 가지며 나머지 요소는 다른 형식을 갖습니다.제 솔루션은 다음과 같습니다.

my_schema = {
    "type": "object",
    "properties": {
        "token": {"type": "string"},
        "service_id": {"type": "string"},
        "promo_code": {"type": "string"},
        "path": {
            "type": "array",
            "items": [
                {
                    "type": "object",
                    "properties": {
                        "address": {"type": "string"},
                        "lat": {"type": "number"},
                        "lng": {"type": "number"}
                    },
                    "required": ["address", "lat", "lng"]
                },
                {
                    "type": "object",
                    "properties": {
                        "address": {"type": "string"},
                        "lat": {"type": "number"},
                        "lng": {"type": "number"},
                        "district_id": {"type": "number"},
                        "ward_code": {"type": "number"},
                        "weight": {"type": "number"}
                    },
                    "required": ["address","lat", "lng","ward_code", 
                                 "district_id", "weight"]
                }
            ]
        }
    },
    "required": ["token", "service_id", "path"]
}

위의 스키마는 경로의 두 번째 요소에서 group_id, ward_code, weight가 필요함을 의미합니다.

언급URL : https://stackoverflow.com/questions/15396251/correct-json-schema-for-an-array-of-items-of-different-type

반응형