JSON Samouczek
Rozpoczęcie pracy z JSON
Szukaj…
Uwagi
JSON (JavaScript Object Notation) jest jednym z najpopularniejszych i powszechnie akceptowanych formatów wymiany danych pierwotnie określonych przez Douglasa Crockforda.
Jest to obecnie opisane przez dwa konkurujące ze sobą standardy, RFC 71592 i ECMA-404 . Standard ECMA jest minimalny, opisujący tylko dozwoloną składnię gramatyczną, podczas gdy RFC zapewnia również pewne kwestie semantyczne i bezpieczeństwa.
- JSON jest powszechnie akceptowany w oprogramowaniu, które obejmuje architekturę klient-serwer do wymiany danych między klientem a serwerem.
- JSON jest łatwy w użyciu i oparty na tekście, lekki i czytelny dla człowieka format, a ludzie często źle rozumieją jako zamiennik XML.
- Chociaż skrót zaczyna się od JavaScript, JSON nie jest językiem ani literami językowymi, jest jedynie specyfikacją zapisu danych.
- Jest niezależny od platformy i języka i jest wbudowany w prawie wszystkie języki frameworku / frameworki, takie jak, a obsługa formatu danych JSON jest dostępna we wszystkich popularnych językach, z których niektóre to C #, PHP, Java, C ++, Python, Ruby i wiele więcej.
- Oficjalnym rodzajem mediów internetowych dla JSON jest application / json.
- Rozszerzenie nazwy pliku JSON to .json.
Wersje
Ponieważ JSON nie ma żadnych aktualizacji, jest tylko jedna wersja JSON, poniższy link przekierowuje do oryginalnego dokumentu RFC, którym jest RFC 4627.
Wersja | Data wydania |
---|---|
Oryginalny | 2006-07-28 |
Zasady składni JSON
Składnia JSON (JavaScript Object Notation) oparta jest na podzbiorze JavaScript (patrz także json.org ).
Prawidłowe wyrażenie JSON może być jednym z następujących typów danych
- proste typy danych: String, Number, Boolean, Null
- złożone typy danych: wartość, obiekt, tablica
Proste typy danych
Ciąg JSON musi być ujęty w podwójne cudzysłowy i może zawierać zero lub więcej znaków Unicode; dozwolone są ucieczki odwrotne. Zaakceptowane numery JSON są w notacji E. Boolean to true
, false
. Null to zastrzeżone słowo kluczowe null
.
Typ danych | Przykłady prawidłowego JSON |
---|---|
### Strunowy | "apple" |
"苹果" | |
"\u00c4pfel\n" | |
"" | |
### Number | 3 |
1.4 | |
-1.5e3 | |
### Boolean | true |
false | |
### Zero | null |
Złożone typy danych
WartośćWartością JSON może być: String, Number, Boolean, Null, Object, Array.
ObiektObiekt JSON to oddzielona przecinkami nieuporządkowana kolekcja par nazwa: wartość zamknięta w nawiasach klamrowych, gdzie nazwa jest ciągiem, a wartość wartością JSON.
SzykTablica JSON to uporządkowana kolekcja wartości JSON.
Przykład tablicy JSON:
["home", "wooden"]
Przykłady obiektów JSON:
{
"id": 1,
"name": "A wooden door",
"price": 12.50,
"tags": ["home", "wooden"]
}
[
1,
2,
[3, 4, 5, 6],
{
"id": 1,
"name": "A wooden door",
"price": 12.50,
"tags": ["home", "wooden"]
}
]
Narzędzia online do sprawdzania poprawności i formatowania danych JSON:
- http://jsonlint.com/
- http://www.freeformatter.com/json-validator.html
- http://jsonviewer.stack.hu/
- http://json.parser.online.fr/
Obiekt JSON
Obiekt JSON jest otoczony nawiasami klamrowymi i zawiera pary klucz-wartość.
{ "key1": "value1", "key2": "value2", ... }
Klucze muszą być poprawnymi ciągami znaków, dlatego są otoczone podwójnymi cudzysłowami. Wartości mogą być obiektami JSON, liczbami, łańcuchami, tablicami lub jedną z następujących „literalnych nazw”: false
, null
lub true
. W parze klucz-wartość klucz jest oddzielany od wartości dwukropkiem. Wiele par klucz-wartość jest oddzielonych przecinkami.
Porządek w obiektach nie jest ważny. Poniższy obiekt JSON jest zatem równoważny powyższemu:
{ "key2": "value2", "key1": "value1", ... }
Podsumowując, jest to przykład poprawnego obiektu JSON:
{
"image": {
"width": 800,
"height": 600,
"title": "View from 15th Floor",
"thumbnail": {
"url": "http://www.example.com/image/481989943",
"height": 125,
"width": 100
},
"visible": true,
"ids": [116, 943, 234, 38793]
}
}
Typowe przykłady obiektów JSON z powiązanymi odpowiednikami obiektów (Java)
W tym przykładzie zakłada się, że obiekt „root”, który jest szeregowany do JSON, jest instancją następującej klasy:
public class MyJson {
}
Przykład 1: Przykład wystąpienia MyJson
, taki jak:
{}
tzn. ponieważ klasa nie ma pól, serializowane są tylko nawiasy klamrowe. Nawiasy klamrowe to wspólne ograniczniki reprezentujące obiekt . Zauważ też, że obiekt główny nie jest szeregowany jako para klucz-wartość. Dotyczy to również prostych typów (ciąg, liczby, tablice), gdy nie są one polami (zewnętrznego) obiektu.
Przykład 2: Dodajmy kilka pól do MyJson
i zainicjuj je pewnymi wartościami:
// another class, useful to show how objects are serialized when inside other objects
public class MyOtherJson {}
// an enriched version of our test class
public class MyJson {
String myString = "my string";
int myInt = 5;
double[] myArrayOfDoubles = new double[] { 3.14, 2.72 };
MyOtherJson objectInObject = new MyOtherJson();
}
To jest powiązana reprezentacja JSON:
{
"myString" : "my string",
"myInt" : 5,
"myArrayOfDoubles" : [ 3.14, 2.72 ],
"objectInObject" : {}
}
Zwróć uwagę, w jaki sposób wszystkie pola są serializowane w strukturze klucz-wartość, gdzie klucz jest nazwą pola przechowującego wartość. Typowymi ogranicznikami tablic są nawiasy kwadratowe. Zauważ też, że po każdej parze klucz-wartość występuje przecinek, z wyjątkiem ostatniej pary.
JSON Array
Tablica JSON to uporządkowana kolekcja wartości. Jest otoczony nawiasami kwadratowymi, tj. []
, A wartości są rozdzielane przecinkami:
{ "colors" : [ "red", "green", "blue" ] }
Tablice JSON mogą również zawierać dowolny poprawny element JSON, w tym obiekty, jak w tym przykładzie tablicy z 2 obiektami (pobranymi z dokumentu RFC):
[
{
"precision": "zip",
"Latitude": 37.7668,
"Longitude": -122.3959,
"Address": "",
"City": "SAN FRANCISCO",
"State": "CA",
"Zip": "94107",
"Country": "US"
},
{
"precision": "zip",
"Latitude": 37.371991,
"Longitude": -122.026020,
"Address": "",
"City": "SUNNYVALE",
"State": "CA",
"Zip": "94085",
"Country": "US"
}
]
Mogą również zawierać elementy o mieszanych typach, na przykład:
[
"red",
51,
true,
null,
{
"state": "complete"
}
]
Częstym błędem podczas pisania tablic JSON (i obiektów) jest pozostawienie końcowego przecinka za ostatnim elementem. Jest to powszechny wzorzec w wielu językach, ale niestety nie jest prawidłowy w JSON. Na przykład następująca tablica jest nieprawidłowa:
[
1,
2,
]
Aby to było prawidłowe, musisz usunąć przecinek za ostatnim elementem, zamieniając go w:
[
1,
2
]
Ręczna edycja JSON
JSON jest bardzo ścisłym formatem (patrz http://json.org) . Ułatwia to parsowanie i pisanie dla maszyn, ale zaskakuje ludzi, gdy niepozorne błędy psują dokument.
Częste problemy
Końcowy przecinek
W przeciwieństwie do większości języków programowania nie można dodawać przecinka końcowego:
{
a: 1,
b: 2,
c: 3
}
Dodanie przecinka po 3
spowoduje błąd synx.
Ten sam problem występuje w przypadku tablic:
[
1,
2
]
Musisz zachować szczególną ostrożność, jeśli chcesz zmienić kolejność elementów.
Brakujący przecinek
{
a: 1,
b: 2,
c: 3
d: 4
}
Ponieważ przecinki końcowe nie są dozwolone, łatwo zapomnieć o dodaniu jednego przed dodaniem nowej wartości (w tym przypadku po 3
).
Komentarze
JSON nie zezwala na komentarze, ponieważ jest to format wymiany danych. To wciąż gorący temat, ale nie ma jasnych odpowiedzi oprócz tego, że ich nie używasz.
Istnieje kilka obejść:
- Użyj komentarzy w stylu C, a następnie usuń je przed przekazaniem do parsera
- Umieść komentarze w danych
{
"//": "comment",
"data": 1
}
- Osadzaj komentarze i zastępuj je danymi
{
"data": "comment",
"data": 1
}
Drugi wpis data
zastąpi komentarz w większości parserów .
Rozwiązania
Aby ułatwić pisanie JSON, użyj IDE, które sprawdza błędy składniowe i zapewnia kolorowanie składni. Wtyczki są dostępne dla większości edytorów.
Tworząc aplikacje i narzędzia, używaj JSON wewnętrznie i jako protokół, ale staraj się nie ujawniać go w miejscach, w których człowiek prawdopodobnie będzie musiał go edytować ręcznie (z wyjątkiem debugowania).
Oceń inne formaty, które lepiej nadają się do tego zastosowania, takie jak:
- Hjson , można bezproblemowo konwertować do iz JSON
- TOML , podobny do plików INI
- YAML , więcej funkcji, ale kosztem większej złożoności
Uzasadnienie dla Array vs. Object (tj. Kiedy użyć czego)
Tablice JSON reprezentują kolekcję obiektów. W JS jest wiele funkcji kolekcji, takich jak slice
, pop
, push
. Obiekty mają po prostu więcej surowych danych.
JSONArray to uporządkowana sekwencja wartości . Zewnętrzna forma tekstu to ciąg owinięty w nawiasy kwadratowe z przecinkami oddzielającymi wartości.
JSONObject to nieuporządkowany zbiór par nazwa / wartość . Jego forma zewnętrzna to ciąg zawinięty w nawiasy klamrowe z dwukropkami między nazwami i wartościami oraz przecinki między wartościami i nazwami.
Obiekt - klucz i wartość, Tablica - cyfry, łańcuchy, booleany. Kiedy używasz tego czy tamtego?
Możesz myśleć o tablicach jako „jest a / an”, a Objects jako „ma a”. Użyjmy „Fruit” jako przykładu. Każda pozycja w tablicy owoców jest rodzajem owoców.
array fruit : [orange, mango, banana]
Tablice mogą zawierać obiekty, łańcuchy, liczby, tablice, ale pozwalają sobie na obsługę tylko obiektów i tablic.
array fruit : [orange:[], mango:{}, banana:{}]
. Widać, że pomarańczowy jest również tablicą. Oznacza to, że każdy przedmiot, który przechodzi w pomarańczowy, jest rodzajem pomarańczy, powiedzmy: bitter_orange, mandarin, sweet_orange.
dla przedmiotu owocowego każdy element w nim jest atrybutem owocu. w ten sposób owoc ma
object fruit :{seed:{}, endocarp:{},flesh:{}}
Oznacza to również, że wszystko w obiekcie nasiennym powinno być własnością nasienia, powiedzmy: kolor, ..
JSON to przede wszystkim język, który pozwala na serializację obiektów javascript w łańcuchy. Tak więc po deserializacji łańcucha JSON powinieneś uzyskać strukturę obiektu javascript. Jeśli twój Json przekształca się w obiekt, który przechowuje 100 obiektów o nazwie obiekt1 do obiektu 100, będzie to bardzo niewygodne. Większość deserializatorów oczekuje, że będziesz mieć znane obiekty i tablice znanych obiektów, aby mogły konwertować ciągi znaków na rzeczywistą strukturę obiektów w języku, którego używasz. Jest to również pytanie, na które odpowiedziałaby Ci filozofia projektowania obiektowego.
kredyty dla wszystkich uczestników Jakie są różnice między używaniem tablic JSON a obiektami JSON?