2010-07-09 24 views
29

Jaki jest najlepszy sposób opisywania danych JSON w specyfikacji?Jak opisać dane JSON w specyfikacji?

W przeszłości używałem przykładów z opisami "rozwlekły", ale wydaje się nieprecyzyjny.

Wygląda na to, że powstaje nowy standard JSON schema, ale nie wygląda to na bardzo aktywny projekt. Jakieś inne sposoby?


(Aktualizacja) Po myśleć o tym przez kilka dni Lubię bmargulies sugestię wokół stosując konwencję konwersji. Ponieważ dokumenty JSON w tym przypadku pochodzą z usług internetowych .NET, zamierzam po prostu udokumentować schemat ze składnią klasy C#. To może nie być całkowicie surowe, ale wszyscy zaangażowani to zrozumieją i w połączeniu z przykładami otrzymają wiadomość tak szybko jak to możliwe.

+0

Czy potrzebujesz standardowego sposobu określania schematu JSON lub formalnego sposobu pisania narzędzi do sprawdzania danych zgodnie ze specyfikacją? –

+0

Przede wszystkim chciałbym standardowej notacji/składni dla spójności, i które inni czytający specyfikację będą już zaznajomieni. Narzędzia do sprawdzania poprawności próbek również byłyby świetne i bardzo przydatne do testowania jednostkowego. –

+1

Cokolwiek robisz, nie trać przykładów. Oni są najlepszym sposobem na opisanie twojego schematu. Potrzebujesz jednak czegoś innego we wszystkich przypadkach na rogu. –

Odpowiedz

2

Co powiesz na używanie rozszerzonego BNF?

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 

Musisz zdefiniować znaczenie opisów typów atomowych, takich jak INTEGER i STRING gdzieś. Jeśli chcesz dodać klucze non-ustalony dla słowników, należy określić, że w następujący sposób:

BREADLOOKUP <- { (TYPE : HOWMANY)+ } 

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

HOWMANY <- POSITIVE-INTEGER 

Pozwoliłoby rzeczy jak

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

Ponieważ oba wyrażenia regularne i BNF są dość dobrze znane, to może być łatwym sposobem na przejście na . ?, +, *, {n}, {min,max} byłoby łatwym sposobem na określenie wielu elementów (wziętych z wyrażeń regularnych), a reszta to w zasadzie BNF.

Jeśli zrobiłeś to wystarczająco rygorystycznie, może to być nawet parsable dla walidatora.

+0

To zadziała, ale straci to naturalne zagnieżdżenie dokumentu JSON, a ogólna struktura wymaga trochę za dużo myślenia (przynajmniej dla mnie!). –

+0

Czy możesz podać przykład struktury json, którą chciałbyś opisać? – JeSuisse

1

Można połączyć Schemat XML W3C lub jakiś mniej brzydki schemat, jak RelaxNG, z konwencjami konwersji.

+0

Nie jestem zaznajomiony z RelaxNG ... ale podoba mi się pomysł użycia konwencji konwersji. –

7

Wiem, że jest to starsze pytanie, ale może być przydatne dla kogoś innego: Szukając metod opisu danych JSON natknąłem się na Orderly. Oto abstrakcyjne prawo na pierwszej stronie:

Uporządkowany jest tekstowym formatem opisującym JSON. Poprawnie można skompilować do JSONSchema. Jest zaprojektowany tak, aby był łatwy do odczytu i zapisu.

Zgadzam się z tym, ale próbowałem go tylko z relatywnie prostymi strukturami.

12

Polecam moją bibliotekę JavaScript js-schema. Podstawową motywacją było to, co opisałeś w pytaniu. Jest to prosta i łatwa do zrozumienia notacja opisująca schematy JSON (lub specyfikację, jeśli chcesz).

Przykład schematu opisanego w JSON schematu:

{ 
    "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" 
     } 
    } 
    } 
} 

a sam opis schematu z JS schematu:

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

Biblioteka jest w stanie sprawdzić obiekt na schematach, generuje losowe obiekty zgodnego do określonego schematu i serializować/deserializować do/od JSON Schema.