2010-07-09 45 views
29

Cách tốt nhất để mô tả dữ liệu JSON trong thông số kỹ thuật là gì?Cách mô tả dữ liệu JSON trong thông số kỹ thuật?

Trong quá khứ tôi đã sử dụng các ví dụ có mô tả 'dài dòng', nhưng nó cảm thấy không chính xác.

Có vẻ như tiêu chuẩn mới bắt đầu là JSON schema, nhưng nó không giống như một dự án cực kỳ tích cực. Có cách nào khác không?


(Cập nhật) Sau khi suy nghĩ về vấn đề này trong vài ngày tôi thích bmargulies gợi ý xung quanh sử dụng một quy ước chuyển đổi. Vì các tài liệu JSON trong trường hợp này chúng ta sắp ra khỏi các dịch vụ web .NET Tôi sẽ chỉ đơn giản là viết tư liệu lược đồ với cú pháp lớp C#. Điều này có thể không hoàn toàn khắt khe, nhưng mọi người tham gia sẽ hiểu nó và kết hợp với các ví dụ sẽ nhận được thông điệp trên càng nhanh càng tốt.

+0

Bạn có cần một cách tiêu chuẩn để chỉ định lược đồ JSON hoặc cách chính thức để viết các công cụ để kiểm tra dữ liệu theo thông số kỹ thuật không? –

+0

Chủ yếu là tôi muốn một ký pháp/cú pháp chuẩn cho tính nhất quán, và những người khác đọc thông số này sẽ quen thuộc với nó. Các công cụ để xác nhận mẫu sẽ là tuyệt vời quá, và rất hữu ích cho thử nghiệm đơn vị. –

+1

Dù bạn làm gì, đừng làm mất các ví dụ. Họ _are_ cách tốt nhất để mô tả lược đồ của bạn. Bạn cần một cái gì đó khác cho tất cả các trường hợp góc, mặc dù. –

Trả lời

2

Làm thế nào để sử dụng một số loại BNF mở rộng?

PERSON <- { "firstname": FIRSTNAMES, "lastname": LASTNAME, "age": AGE, "version": VERSION, "parents" <- PARENTS } 

FIRSTNAMES <- [ FIRSTNAME+ ] 

FIRSTNAME <- STRING 

LASTNAME <- STRING 

PARENTS <- [ PERSON{0,2} ] 

AGE <- INTEGER 

VERSION <- 1 | 2 

Bạn phải xác định ý nghĩa của mô tả loại nguyên tử như INTEGER và STRING ở đâu đó. Nếu bạn muốn thêm phím không hardcoded cho từ điển, bạn sẽ xác định rằng như sau:

BREADLOOKUP <- { (TYPE : HOWMANY)+ } 

TYPE <- "white" | "dark" | "french" | "croissant" 

HOWMANY <- POSITIVE-INTEGER 

này sẽ cho phép những thứ như

{ "white": 5, 
    "french": 2 
} 

Kể từ khi cả hai biểu thức thông thường và BNF đang khá nổi tiếng, điều này có thể là một cách dễ dàng để hoạt động. ?, +, *, {n}, {min,max} sẽ là những cách dễ dàng để chỉ định một số yếu tố (được lấy từ regex) và phần còn lại là khá nhiều BNF thuần túy.

Nếu bạn đã làm điều đó một cách khắt khe, nó thậm chí có thể phân tích cú pháp cho trình xác thực.

+0

Điều này sẽ hiệu quả, nhưng nó mất đi sự làm tổ cố hữu của một tài liệu JSON và cấu trúc tổng thể đòi hỏi một chút suy nghĩ quá nhiều (ít nhất là cho tôi) –

+0

Bạn có thể đăng một ví dụ về cấu trúc json mà bạn muốn mô tả không? – JeSuisse

1

Bạn có thể kết hợp một lược đồ XML W3C hoặc một số lược đồ ít xấu xí hơn như RelaxNG, với các quy ước chuyển đổi.

+0

Tôi không quen thuộc với RelaxNG ... nhưng tôi thích ý tưởng sử dụng quy ước chuyển đổi. –

7

Tôi biết đây là một câu hỏi cũ, nhưng nó có thể hữu ích cho người khác: Khi tìm kiếm các phương pháp mô tả dữ liệu JSON tôi tình cờ gặp Orderly. Đây là quyền trừu tượng của trang chủ:

Thứ tự là định dạng văn bản để mô tả JSON. Thứ tự có thể được biên dịch thành JSONSchema. Nó được thiết kế để dễ đọc và viết.

Tôi có thể đồng ý với điều đó, nhưng tôi chỉ thử nó với cấu trúc tương đối đơn giản cho đến nay.

12

Tôi muốn giới thiệu thư viện JavaScript js-schema của tôi. Động cơ chính đằng sau nó giống như những gì bạn mô tả trong câu hỏi. Đó là một ký pháp đơn giản và dễ hiểu để mô tả các lược đồ JSON (hoặc đặc tả, nếu bạn muốn).

Một schema dụ được mô tả trong JSON Schema:

{ 
    "type":"object", 
    "properties":{ 
    "id":{ 
     "type":"number", 
     "required":true 
    }, 
    "name":{ 
     "type":"string", 
     "required":true 
    }, 
    "price":{ 
     "type": "number", 
     "minimum":0, 
     "required":true 
    }, 
    "tags":{ 
     "type":"array", 
     "items":{ 
     "type":"string" 
     } 
    } 
    } 
} 

và mô tả sơ đồ tương tự với js-schema:

{ 
    "id" : Number, 
    "name" : String, 
    "price" : Number.min(0), 
    "?tags" : Array.of(String) 
} 

Thư viện có thể xác nhận đối tượng chống lại schemas, tạo đối tượng ngẫu nhiên phù hợp đến một lược đồ đã cho và tuần tự hóa/deserialize thành/từ JSON Schema.

Các vấn đề liên quan