Để lái xe giỏi thì cần tập lái nhiều hay trở thành kỹ sư kỹ thuật ô tô?
Mô tả và xác minh dữ liệu là nhu cầu cần thiết với hầu hết mọi ứng dụng. Bài viết sau đây giới thiệu về JSON Type Definition - một ngôn ngữ mô tả dữ liệu như JSON Schema. Nếu bạn chưa từng nghe tới JSON hay ngôn ngữ mô tả dữ liệu, hãy xem phần 1: giới thiệu về JSON và JSON Schema.
JSON Type Definition là gì?#
JSON Type Definition hay JSON Type Def hay JTD, có tên đặc tả là RFC 8927, là một ngôn ngữ được chuẩn hóa để mô tả dữ liệu JSON. JTD có thể được sử dụng để xác minh dữ liệu JSON, sinh dữ liệu giả, sinh code với nhiều ngôn ngữ lập trình.
Tương tự như JSON Schema, JTD sử dụng chính JSON để mô tả dữ liệu JSON. Dưới đây là một ví dụ:
{
"properties": {
"name": { "type": "string" },
"isAdmin": { "type": "boolean" }
}
}
Viết schema bằng YAML, rồi chuyển đổi sang JSON, cũng là một cách làm hay được sử dụng trong thực tế.
properties:
name:
type: string
isAdmin:
type: boolean
Tạo schema trong JTD#
Tính đến tháng 9/2022 - thời điểm viết bài này, một schema viết bằng JTD thuộc, và phải thuộc, một trong 8 kiểu sau:
- Rỗng: chấp nhận bất cứ kiểu dữ liệu nào, giống
Object
Java hayany
TypeScript.
{}
type
: chấp nhận các kiểu dữ liệu nguyên thủy trong Java hay Typescript.
{ "type": "boolean" }
{ "type": "timestamp" }
{ "type": "float64" }
enum
: chấp nhận một tập hợp giá trị được định nghĩa sẵn, giốngenum
trong Java hay Typescript.
{ "enum": ["FOO", "BAR", "BAZ"] }
elements
: chấp nhận một mảng, giốngList<T>
Java hayT[]
TypeScript.
{ "elements": { "type": "string" } }
// accepts: ["foo", "bar"]
// rejects: [1, 2, 3]
properties
: chấp nhận dữ liệu có cấu trúc được định nghĩa, giốngclass
Java hoặcinterface
TypeScript.
{
"properties": {
"name": { "type": "string" },
"isAdmin": { "type": "boolean" }
}
}
// accepted
{ "name": "Abraham Lincoln", "isAdmin": true }
// rejected
{ "name": "Abraham Lincoln", "isAdmin": true, "extra": "stuff" }
values
: chấp nhận dữ liệu kiểu key-value, giốngMap<String, T>
Java hay{ [key: string]: T}
TypeScript.
{ "values": { "type": "boolean" }}
// accepted
{"a": true, "b": false}
// rejected
{"a": 123}
discriminator
: mô tả cấu trúc phức hợp, tham khảo tagged union.
{
"discriminator": "eventType",
"mapping": {
"USER_CREATED": {
"properties": {
"id": { "type": "string" }
}
},
"USER_PAYMENT_PLAN_CHANGED": {
"properties": {
"id": { "type": "string" },
"plan": { "enum": ["FREE", "PAID"]}
}
},
"USER_DELETED": {
"properties": {
"id": { "type": "string" },
"softDelete": { "type": "boolean" }
}
}
}
}
// possible accepted data
{ "eventType": "USER_CREATED", "id": "users/123" }
{ "eventType": "USER_CREATED", "id": "users/456" }
{ "eventType": "USER_PAYMENT_PLAN_CHANGED", "id": "users/789", "plan": "PAID" }
{ "eventType": "USER_PAYMENT_PLAN_CHANGED", "id": "users/123", "plan": "FREE" }
{ "eventType": "USER_DELETED", "id": "users/456", "softDelete": false }
ref
: tham chiếu đến một schema khác nhằm dùng lại schema (DRY).
{
"definitions": {
"coordinates": {
"properties": {
"lat": { "type": "float32" },
"lng": { "type": "float32" }
}
}
},
"properties": {
"userLoc": { "ref": "coordinates" },
"serverLoc": { "ref": "coordinates" }
}
}
// accepted
{ "userLoc": { "lat": 50, "lng": -90 }, "serverLoc": { "lat": -15, "lng": 50 }}
Muốn biết chi tiết hơn? Bắt đầu ngay học JTD trong 5 phút.
So sánh với JSON Schema#
JSON Schema | JTD | |
---|---|---|
Ưu điểm |
|
|
Nhược điểm |
|
|