JSON Toolkit

draft-07 atau 2020-12

Inti pati: 2020-12 ialah versi semasa dan menambah $defs, prefixItems dan unevaluatedProperties, tetapi banyak alat masih hanya menyokong draft-07. Pilih mengikut apa yang disokong oleh keseluruhan rantai alat anda.

Lanjutan~4 min bacaanDiterbitkan 2026-10-30Dikemas kini 2026-10-30
Perbezaan antara draf JSON Schema dan cara memilih

Pokoknya: guna 2020-12 untuk projek baharu, kembali kepada draft-07 sebaik sahaja mana-mana pengesah, penjana kod atau alat OpenAPI hanya menyokongnya, dan sentiasa tetapkan draf dengan $schema.

Jawapan ringkas: 2020-12 untuk kerja baharu, draft-07 apabila komponen lama memaksa.

Garis masa

Draf Tahun Ketara
draft-04 2013 id dan bukannya $id; masih biasa dalam API lama
draft-06 2017 const, propertyNames
draft-07 2018 if/then/else, readOnly, contentMediaType; keserasian terbaik
2019-09 2019 $defs menggantikan definitions, unevaluatedProperties
2020-12 2020 prefixItems, $dynamicRef; saranan semasa

Apa yang 2020-12 perbaiki

Tuple tatasusunan tidak lagi menjadi kes khas. draft-07 menyatakan "elemen pertama ialah A, kedua ialah B" dengan items: [{...}, {...}] serta additionalItems. 2020-12 menggunakan prefixItems untuk schema khusus kedudukan dan items untuk selebihnya.

$defs ialah nama piawai. Alat yang ditulis selepas 2019 mencarinya secara lalai.

unevaluatedProperties berfungsi dengan komposisi. Dengan allOf, additionalProperties: false menolak medan yang ditakrifkan oleh cabang seiring. unevaluatedProperties: false hanya mempertimbangkan sifat yang benar-benar dinilai oleh keseluruhan schema, iaitu apa yang diperlukan oleh komposisi.

Bila draft-07 ialah jawapan yang betul

Situasi Sebab
OpenAPI 3.0 Objek schema-nya ialah subset draft-04/07
Pengesah lama (ajv 6, sesetengah pustaka Java) Ia tidak mengenali prefixItems atau $dynamicRef
Platform mewajibkan sesuatu versi Sesetengah platform low-code dan gateway menetapkannya
Penjana kod yang berhenti pada 07 Kata kunci tidak diketahui diabaikan secara senyap

Uji kes terakhir secara langsung: berikan schema prefixItems kepada pengesah anda. Jika ia lulus tanpa aduan dan bukannya melaporkan kata kunci tidak diketahui, ia mengabaikan kekangan itu — hasil paling berbahaya daripada semua.

Mencampurkan versi

Sentiasa isytiharkan $schema. Lalai berbeza: ajv menganggap draft-07, beberapa pustaka Python menganggap 2020-12. Fail yang sama kemudian disahkan secara berbeza di dua tempat.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.com/schemas/order.json",
  "type": "object"
}

Jangan $ref merentas draf. Tingkah laku tidak ditentukan.

Naik taraf secara berkumpulan. Dua draf dalam satu repositori menjadikan "peraturan mana yang terpakai di sini" sebagai pengetahuan lisan.

Soalan Lazim

Bagaimana saya menyemak sama ada pengesah saya menyokong 2020-12?

Berikan schema yang menggunakan prefixItems kepada pengesah. Ralat kata kunci tidak diketahui bermaksud ia tidak menyokong draf itu; lulus secara senyap bermaksud ia mengabaikan kekangan itu, yang lebih teruk.

Mengapa satu projek harus menggunakan satu draf sahaja?

Dua draf dalam satu repositori menjadikan "peraturan mana yang terpakai di sini" sebagai pengetahuan lisan. Naik taraf secara berkumpulan supaya setiap fail berkongsi tafsiran yang sama.

Patutkah saya sentiasa mengisytiharkan $schema?

Ya. Lalai berbeza: ajv menganggap draft-07 manakala beberapa pustaka Python menganggap 2020-12, jadi fail yang sama boleh disahkan secara berbeza di dua tempat.

Bacaan lanjut