JSON Схема для проверки массива словарей - PullRequest
0 голосов
/ 11 июля 2020

Недавно я задал этот вопрос о том, как избавиться от имени в списке, но понял, что действительно хочу избавиться от имен словарей в массиве.

Я хочу проверить такую ​​структуру (обратите внимание, что словари не названы):

{
    "some list": [
        {
            "foo": "bar"
        },
        {
            "bin": "baz"
        }
    ]
}

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Проблема, похоже, заключается в двусмысленности попытки описать массив как «объект с безымянными свойствами».

Если вы пропустите ненужный объект между ними, вы получите простую схему:

{
  "type": "object",
  "properties": {
    "some list": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "description": "a string"
          },
          {
            "type": "integer",
            "minimum": 0,
            "description": "Default time to expose a single image layer for."
          }
        ]
      }
    }
  }
}
0 голосов
/ 13 июля 2020

JSON альтернатива схемы (только проверка типа):

from dataclasses import asdict, dataclass
from typing import List, Union

from validated_dc import ValidatedDC


@dataclass
class Foo(ValidatedDC):
    foo: str


@dataclass
class Bin(ValidatedDC):
    bin: str


@dataclass
class Items(ValidatedDC):
    some_list: List[Union[Foo, Bin]]


data = [
    {
        "foo": "bar"
    },
    {
        "bin": "baz"
    }
]

items = Items(some_list=data)
assert items.get_errors() is None
assert isinstance(items.some_list[0], Foo)
assert isinstance(items.some_list[1], Bin)
assert asdict(items) == {'some_list': data}

ValidatedD C - https://github.com/EvgeniyBurdin/validated_dc

0 голосов
/ 12 июля 2020

Я пробовал это. Неудивительно, что у меня был файл из другой проблемы.

[  {
"type": "Feature",
"geometry": {
  "type": "Point",
  "coordinates": [
    52.743356,
    -111.546907
  ]
},
"properties": {
  "dealerName": "Smiths Equipment Sales (Smiths Hauling)",
  "address": "HWY 13 - 5018 Alberta Avenue",
  "city": "Lougheed",
  "state": "AB",
  "zip": "T0B 2V0",
  "country": "Canada",
  "website": "http://smithsequipsales.com/",
  "phone": "780-386-3842",
  "dealerCode": "SMI06",
  "tractor": true,
  "utv": false,
  "hp": false
}  },  {
"type": "Feature",
"geometry": {
  "type": "Point",
  "coordinates": [36.16876,-84.07945]
},
"properties": {
  "dealerName": " Tommy's Motorsports",
  "address": "2401 N Charles G Seivers Blvd",
  "city": "Clinton",
  "state": "TN",
  "statename": "United States",
  "zip": "37716",
  "phone": "865-494-6500",
  "website": "https://www.tommysmotorsports.com/",
  "dealerCode": "TOM08",
  "tractor": true,
  "utv": false,
  "hp": false
  }
}
]

Вы можете ввести его так:

import json
   data = json.load(open('test.json'))

    for i in data:
          print(i["type"])
...