2011-11-20 31 views
5

Tôi không cần phải làm gì. Trong khi xác định định dạng của kết quả RESTful API của tôi (viz JSON), tôi cảm thấy nó sẽ dễ dàng hơn để ghi lại nó là của riêng tôi JSON schema. Trong khi viết một câu hỏi tôi có một vài câu hỏi:Một số câu hỏi liên quan đến lược đồ json tùy chỉnh

  1. Trong kết quả của tôi JSON, làm cách nào để chỉ định URI cho giản đồ mà nó xác nhận? --edit-- có sử dụng thuộc tính $schema không?
  2. Có bất kỳ quy ước/nguyên tắc nào cho phiên bản lược đồ JSON không? Có một số thuộc tính mà tôi nên/có thể xác định bên trong lược đồ của tôi như là các thuộc tính không? Tôi thấy JSON schema itself không có phiên bản được xác định ngoại trừ trong URI được chỉ định làm giá trị của khóa $schema.
  3. Tôi có thể chia nhỏ lược đồ JSON LỚN của tôi thành nhiều lược đồ nhỏ hơn và bao gồm một lược đồ khác? Giống như #include trong C++, sau đó tham khảo nhiều lược đồ trong JSON tôi đã gửi tới người dùng dưới dạng kết quả.
  4. Tôi có thể xác định giá trị tùy chỉnh cho "loại" chính không? Ví dụ. Tôi muốn sử dụng lại định nghĩa của "ngày" như thế này:

[bỏ qua dòng này, đó là để có được những định dạng làm việc cho sau json ..]

{ 
    "date":{ 
     "type":"object", 
     "properties":{ 
      "month":{ 
       "type":"integer", 
       "minimum":1, 
       "maximum":12 
      }, 
      "year":{ 
       "type":"integer", 
       "minimum":0 
      } 
     } 
    }, 
    "personInfo":{ 
     "type":"object", 
     "properties":{ 
      "name":{ 
       "type":"string" 
      }, 
      "dateOfBirth":{ 
       "type":"date" 
      } 
     } 
    }, 
    "student":{ 
     "type":"object", 
     "properties":{ 
      "id":{ 
       "type":"personInfo" 
      }, 
      "pass_out_year":{ 
       "type":"date" 
      } 
     } 
    } 
} 

thay vì cung cấp thuộc tính của " ngày" ở nhiều nơi như thế này:

{ 
    "personInfo":{ 
     "type":"object", 
     "properties":{ 
      "name":{ 
       "type":"string" 
      }, 
      "dateOfBirth":{ 
       "type":"object", 
       "properties":{ 
        "month":{ 
         "type":"integer", 
         "minimum":1, 
         "maximum":12 
        }, 
        "year":{ 
         "type":"integer", 
         "minimum":0 
        } 
       } 
      } 
     } 
    }, 
    "student":{ 
     "type":"object", 
     "properties":{ 
      "id":{ 
       "type":"personInfo" 
      }, 
      "pass_out_year":{ 
       "type":"object", 
       "properties":{ 
        "month":{ 
         "type":"integer", 
         "minimum":1, 
         "maximum":12 
        }, 
        "year":{ 
         "type":"integer", 
         "minimum":0 
        } 
       } 
      } 
     } 
    } 
} 

theo 5.1 loại in the spec, đó là không thể, nhưng nó có vẻ như một usecase cơ bản như vậy!

Trả lời

4
  1. Khi bạn đã tìm ra chính xác, $schema có thể được sử dụng để chỉ định giản đồ phù hợp.
  2. Tôi thực sự tìm thấy chủ đề này trong khi googling cho phiên bản JSON Schema và ý tưởng sử dụng URI để phiên bản âm thanh hợp lý.
  3. Bạn có thể sử dụng $ref để liên kết với giản đồ khác sau đó được kéo vào.
  4. Một lần nữa, bạn có thể sử dụng $refJSON Pointer để nhập các định nghĩa từ các lược đồ khác.

Bạn luôn có thể thử nghiệm mọi thứ bằng cách validating giản đồ của mình để xem bạn có mắc phải sai lầm nào không.

1

Các spec dường như cho thấy bạn có thể:

giá trị loại khác có thể được sử dụng cho mục đích tùy chỉnh, ...

Nó sau đó tiếp tục thảo luận về những gì xác nhận tình hình thực hiện tối thiểu có thể làm.

Để suy nghĩ của tôi, những gì bạn muốn làm có vẻ OK. Nó có thể giúp làm rõ lược đồ của bạn để giữ định nghĩa kiểu và tham chiếu kiểu trong cùng một tệp.

Tôi nghĩ rằng tệp của bạn bao gồm Q phải được xử lý bên ngoài json, ví dụ: có một bước dev tạo ra json hoàn chỉnh từ một tập lệnh/mẫu (ví dụ: erb hoặc một số ví dụ như vậy) hợp nhất các tệp phụ của bạn. Theo tôi, dịch vụ của bạn luôn phải cung cấp đầy đủ các json cần thiết để tương tác đầy đủ với dịch vụ đó. Nếu điều này không thể quản lý được từ quan điểm của máy khách, nó có thể là một tín hiệu để tái cấu trúc và giới thiệu một dịch vụ khác.

+0

Có vẻ như công việc quá nhiều, vì vậy tôi sẽ không làm điều đó. Nhưng có, một lựa chọn khả thi, đặc biệt là trong công nghệ ngày nay env Tôi chắc chắn để tìm công cụ để làm điều này trong bất kỳ ngôn ngữ/env. Cảm ơn. – Kashyap

+0

Trong v4 của lược đồ JSON, điều này dường như không được phép nữa: http://json-schema.org/latest/json-schema-validation.html#anchor79 – Mitar

2

Tại sao bạn không chỉ sử dụng "format" : "date" theo #5.23 in JSON Schema Draft 03?

Thêm định nghĩa ngày sinh của bạn không chứa ngày có vẻ như là lỗi.

+0

Cảm ơn. Câu hỏi đặt ra là hiểu thêm về cách xác định cấu trúc tùy chỉnh thay vì cách xác định 'ngày', có nghĩa là chỉ là một ví dụ. – Kashyap

+0

@artemoboturov Liên kết tới # 5.23 có giá trị cho Bản thảo JSON 3 Bản thảo, nhưng trong "bản nháp ổn định" mới nhất 04 thì không có. [Tài liệu Xác thực lược đồ JSON trong phần 7.3.1] (http://json-schema.org/latest/json-schema-validation.html#anchor108) tuyên bố "định dạng" có giá trị "ngày giờ". Thật không may là không có "ngày". –

3

Tại thời điểm viết bài này, phiên bản hiện tại của đặc tả JSON Schema là draft-v4, trong đó định dạng date-time cho string trường là clearly specified và rất hữu ích trong thực tế.

Không có định dạng đơn giản hơn date được xác định cho đến nay, nhưng bạn có thể dễ dàng xác định tài sản của đối tượng của bạn as type string và sau đó áp dụng một formatpattern validation (ECMA 262 phương ngữ regex) trên đầu trang của nó.

Ví dụ:

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "title": "Example Schema" 
    "description": "This schema contains only a birth date property" 
    "type": "object", 
    "required": ["birth_date"], 
    "properties": { 
     "birth_date": { 
      "type": "string", 
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" 
     } 
    } 
} 
+0

Nhưng điều gì sẽ xảy ra nếu anh ta có ngày sinh và dead_date và join_date và last_modified_date và v.v ... thì sao chép lại mẫu ở mọi nơi? –

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