2010-10-20 7 views
89

Jestem nowy w obiektach JSON i JavaScript.Jakie są różnice między obiektem JSON i JavaScript?

  • Czy ktoś może wyjaśnić różnice między JSON a obiektem JavaScript?
  • Jakie są ich zastosowania?
  • Czy jedna jest lepsza od drugiej? Czy to zależy od sytuacji?
  • Kiedy użyć, który z nich, w jakiej sytuacji?
  • Dlaczego JSON został stworzony w pierwszej kolejności? Jaki był jego główny cel?
  • Czy ktoś może podać przykłady, kiedy należy używać JSON zamiast obiektu JavaScript i na odwrót?
+0

Proszę o jedno pytanie na raz. –

+0

możliwy duplikat [Jaka jest różnica między JSON i Object Literal Notation?] (Http://stackoverflow.com/questions/2904131/what-is-the-difference-between-json-and-object-literal-notation) – Teepeemm

Odpowiedz

131

Najpierw trzeba wiedzieć, co jest JSON:

  • Jest język agnostyk Format danych interchange.

Składnia JSON została zainspirowana notacją JavaScript Object Literal, ale istnieją między nimi różnice.

Na przykład w JSON wszystkie klucze musi być cytowany, natomiast w literałów obiektowych nie jest to konieczne:

// JSON: 
{ "foo": "bar" } 

// Object literal: 
var o = { foo: "bar" }; 

Cytaty są obowiązkowe na JSON, ponieważ w JavaScript (dokładniej w ECMAScript 3rd Edition.), korzystanie z zarezerwowanych słów jak nazwy własności jest zabronione, na przykład:

var o = { if: "foo" }; // SyntaxError in ES3 

czas, używając ciąg dosłownego jako nazwy właściwości (podając pro Nazwa Perty) daje żadnych problemów:

var o = { "if": "foo" }; 

Więc dla "zgodność" (i łatwy eval'ing może) cytaty są obowiązkowe?.

typy danych w JSON są ograniczone do następujących wartości:

  • string
  • number
  • object
  • array
  • Dosłowne jako:
    • true
    • false
    • null

Gramatyka Strings zmian. One muszą być ograniczone przez podwójne cytaty, podczas gdy w JavaScript można używać pojedynczych lub podwójnych cudzysłowów zamiennie.

// Invalid JSON: 
{ "foo": 'bar' } 

przyjętym JSON gramatyka Numbers zmienia również w języku JavaScript można użyć szesnastkowego literałów, np 0xFF lub (niesławny) Octal Literówki np 010. W JSON możesz używać tylko dziesiętnych literałów.

// Invalid JSON: 
{ "foo": 0xFF } 

Istnieją pewne implementacje Buggy (Firefox 3.5+ IE8 + json2.js) w literałami ósemkowe błędnie domowe, np JSON.parse('01') powinien wytworzyć SyntaxError.

+34

+1 Dobra odpowiedź, ale może zrobić z podkreśleniem podzbioru: każda ważna deklaracja JSON jest również ważną deklaracją JavaScript, ale nie wszystkie poprawne deklaracje JavaScript są deklaracjami JSON. –

+1

Byłoby również pomocne w zademonstrowaniu jedynego sposobu, w jaki kiedykolwiek zobaczymy JSON w pliku JavaScript; tj. wewnątrz łańcucha. –

+0

@CMS opisuje to doskonale powyżej, ale powiedziałbym, że możesz prawie odróżnić to, co właściwie oznacza JSON ... to jest JavaScript "Oświadczenie"! – Alex

21

JSON jest ciągiem znaków reprezentującym obiekt. Jest to interoperacyjny format serializacji. Nie jest związany tylko z javascript. Na przykład istnieją serializery JSON dla .NET umożliwiające serializację/deserializację obiektów .NET.

Jest to po prostu format umożliwiający konwersję z obiektów na ciąg i powrót, co jest wygodne, jeśli chcesz je przesłać przez przewód.

Jest bardzo zbliżony do reprezentacji obiektów javascript i jeśli po prostu eval() łańcuch JSON otrzymasz odpowiedni obiekt.

+3

Nie pozwól Crockford usłyszeć, jak mówisz, że ... – nickf

+4

@nickf, biblioteka json2.js Crockforda właśnie tak robi, 'eval' po jakiejś" walidacji wyrażenia regularnego ", nie robi nic z * parsowania *: P. W rzeczywistości nawet jego * własna biblioteka * ma pewne odchylenia od [jego własnego RFC] (http://www.ietf.org/rfc/rfc4627.txt?number=4627) !, na przykład, json2.js może błędnie " parsować "Literały ósemkowe, np .:' JSON.parse ("01") '... Uważam to za zabawne: P – CMS

+0

@CMS Cóż, myślę, że Doug sprzeciwiałby się frazie" po prostu 'eval()' ", a następnie ... (sans sprawdzania poprawności regex i tak dalej) – nickf

1

JSON to format wymiany danych, który po prostu wygląda jak podzbiór kodu YAML lub JavaScript, który można wykonać i odzyskać obiekt. Obiekt JavaScript jest po prostu obiektem w JavaScript.

Z JSON będącym formatem wymiany danych, można wymieniać dane strukturalne w formie tekstowej z nim. Jest już całkiem oddzielony od JavaScript. Obiekt JavaScript umożliwia tworzenie i pracę z danymi strukturalnymi podczas wykonywania programu JavaScript.