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.

Obiekt

Obiekt 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.

Szyk

Tablica 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:

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?



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow