Co to jest JSON i dlaczego miałbym go używać?

542

Przejrzałem wikipedię, przejrzałem google i przeczytałem oficjalną dokumentację, ale wciąż nie doszedłem do momentu, w którym naprawdę rozumiem, czym jest JSON i dlaczego go używam.

Od jakiegoś czasu buduję aplikacje wykorzystujące PHP, MySQL oraz JavaScript / HTML, a jeśli JSON może coś zrobić, aby ułatwić mi życie, poprawić kod lub poprawić interfejs użytkownika, chciałbym o tym wiedzieć. Czy ktoś może dać mi zwięzłe wyjaśnienie?

Ben
źródło
2
JSON jest podzbiorem YAML yaml.org
Brad Gilbert
15
copterlabs.com/blog/json-what-it-is-how-it-works-how-to-use-it to ładny prosty przykład użycia
Tom
1
Przeczytaj także o I-JSON: tbray.org/ongoing/When/201x/2015/03/23/i-json
Christophe Roussy
1
+ Brad Gilbert Niezupełnie - jest to własny sposób wyrażania danych i jest podobny do JSON tylko dlatego, że oba wyrażają obiekty jako ciągi znaków (podobnie do XML lub list lub wielu innych), ale JSON jest lepszy do pisania maszynowego, a YAML do pisania przez ludzi .
Ben Aubin

Odpowiedzi:

649

JSON (JavaScript Object Notation) to lekki format używany do wymiany danych. Opiera się na podzbiorze języka JavaScript (sposób, w jaki obiekty są budowane w JavaScript). Jak podano w MDN , niektóre JavaScript to nie JSON, a niektóre JSON to nie JavaScript.

Przykładem tego jest odpowiedź usług internetowych. W „dawnych” czasach serwisy internetowe używały XML jako podstawowego formatu danych do przesyłania danych zwrotnych, ale odkąd pojawił się JSON ( format JSON jest określony w RFC 4627 przez Douglasa Crockforda ), był to format preferowany, ponieważ jest o wiele bardziej lekki

O wiele więcej informacji można znaleźć na oficjalnej stronie internetowej JSON .

JSON jest zbudowany na dwóch strukturach:

  • Zbiór par nazwa / wartość. W różnych językach jest to realizowane jako obiekt, rekord, struktura, słownik, tablica skrótów, lista kluczy lub tablica asocjacyjna.
  • Uporządkowana lista wartości. W większości języków jest to realizowane jako tablica, wektor, lista lub sekwencja.

Struktura JSON



JSON Schemat obiektu

Schemat tablicy JSON

Wykres wartości JSON

JSON Schemat łańcuchowy

JSON Schemat liczbowy

Oto przykład danych JSON:

{
     "firstName": "John",
     "lastName": "Smith",
     "address": {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": 10021
     },
     "phoneNumbers": [
         "212 555-1234",
         "646 555-4567"
     ]
 }

JSON w JavaScript

JSON (w JavaScript) to ciąg znaków!

Ludzie często zakładają, że wszystkie obiekty JavaScript są JSON i że JSON jest obiektem JavaScript. To jest niepoprawne.

W JavaScript nievar x = {x:y} jest JSON , to jest obiekt JavaScript . Obie nie są tym samym. Odpowiednikiem JSON (reprezentowanym w języku JavaScript) byłby var x = '{"x":"y"}'. xjest obiektem typu string, a nie obiektem samym w sobie. Aby przekształcić to w pełnoprawny obiekt JavaScript, musisz go najpierw przeanalizować var x = JSON.parse('{"x":"y"}');, xjest teraz obiektem, ale to już nie jest JSON.

Zobacz obiekt JavaScript Vs JSON


Podczas pracy z JSON i JavaScript może pojawić się pokusa, aby użyć evalfunkcji do oceny wyniku zwróconego w wywołaniu zwrotnym, ale nie jest to sugerowane, ponieważ istnieją dwa znaki (U + 2028 i U + 2029) prawidłowe w JSON, ale nie w JavaScript (czytaj więcej o tym tutaj ).

Dlatego zawsze należy próbować użyć skryptu Crockforda, który sprawdza poprawność JSON przed jego oceną. Link do wyjaśnienia skryptu znajduje się tutaj, a tutaj jest bezpośredni link do pliku js. Obecnie każda duża przeglądarka ma własną implementację .

Przykład użycia parsera JSON (z jsonem z powyższego fragmentu kodu):

//The callback function that will be executed once data is received from the server
var callback = function (result) {
    var johnny = JSON.parse(result);
    //Now, the variable 'johnny' is an object that contains all of the properties 
    //from the above code snippet (the json example)
    alert(johnny.firstName + ' ' + johnny.lastName); //Will alert 'John Smith'
};

Parsera JSON oferuje również inny bardzo użyteczną metodę stringify. Ta metoda przyjmuje obiekt JavaScript jako parametr i zwraca ciąg znaków w formacie JSON. Jest to przydatne, gdy chcesz wysłać dane z powrotem na serwer:

var anObject = {name: "Andreas", surname : "Grech", age : 20};
var jsonFormat = JSON.stringify(anObject);
//The above method will output this: {"name":"Andreas","surname":"Grech","age":20}

Powyższe dwie metody ( parsei stringify) również biorą drugi parametr, który jest funkcją, która będzie wywoływana dla każdego klucza i wartości na każdym poziomie wyniku końcowego, a każda wartość zostanie zastąpiona wynikiem wprowadzonej funkcji. (Więcej na ten temat tutaj )

Btw, dla wszystkich, którzy uważają, że JSON jest przeznaczony tylko do JavaScript, sprawdź ten post, który wyjaśnia i potwierdza inaczej.


Bibliografia

Andreas Grech
źródło
1
Niezależnie od sposobu szeregowania informacji, będziesz mieć parser, prawda? Dlatego kogo obchodzi, jakiego formatu używasz do przesyłania danych, jeśli szczegóły jego implementacji zostaną usunięte.
Tom Lehman,
6
Cóż, w rzeczywistości, jeśli przesyłasz dane do iz powrotem do klienta i serwera, uważam, że bardzo ważne jest, aby uważać na wielkość swoich odpowiedzi.
Andreas Grech,
9
Dla pedantycznych jest kilka znaków, które JSON obsługuje inaczej niż JavaScript, co uniemożliwia, że ​​jest to ścisły podzbiór: timelessrepo.com/json-isnt-a-javascript-subset
Jeremy Banks
Kiedy mówisz, że jest on znacznie mniejszy niż XML, czy masz na myśli rozmiar pliku, czy też lekki ma znaczenie przestrzenne w kodowaniu?
whatahitson
1
Czy zastąpiłbyś XML JSON? Czy tak mówisz? Jeśli tak ... Świetnie, xml to koszmar.
James111
66

Wyjaśnienie koncepcji - brak kodu lub żargonu technicznego

Co to jest JSON? - Jak wyjaśniłem to mojej żonie TM

Ja: „Jest to w zasadzie sposób komunikowania się z kimś na piśmie ... ale z bardzo szczegółowymi zasadami.

Żona: tak ....?

Ja: W prozaicznym angielskim zasady są dość luźne: tak jak w przypadku walki w klatkach. W przypadku JSON tak nie jest. Istnieje wiele sposobów na opisanie czegoś:

• Przykład 1: Nasza rodzina ma 4 osoby: Ty, ja i 2 dzieci.

• Przykład 2: Nasza rodzina: ty, ja, dziecko1 i dziecko2.

• Przykład 3: Rodzina: [ty, ja, dziecko1, dziecko2]

• Przykład 4: mamy 4 osoby w naszej rodzinie: mama, tata, dziecko1 i dziecko2.

Żona: Dlaczego zamiast tego nie używają zwykłego angielskiego?

Ja: tak, ale pamiętajmy, że mamy do czynienia z komputerami. Komputer jest głupi i nie będzie w stanie zrozumieć zdań. Musimy więc być bardzo konkretni, gdy w grę wchodzą komputery, w przeciwnym razie mogą się pomylić. Ponadto JSON jest dość skutecznym sposobem komunikowania się, więc większość nieistotnych rzeczy jest wycinana, co jest ładną ręką. Jeśli chcesz komunikować się z naszą rodziną za pomocą komputera, możesz to zrobić w następujący sposób:

{
                "Family" :  ["Me", "Wife", "Kid1", "Kid2"] 
}

…… i to w zasadzie JSON. Ale pamiętaj, MUSISZ przestrzegać zasad gramatyki JSON. Jeśli złamiesz te zasady, komputer po prostu nie zrozumie (tj. Przeanalizuje) tego, co piszesz.

Żona: Więc jak mam pisać w Jsonie?

Dobrym sposobem byłoby użycie serializatora json - biblioteki, która wykonuje dla ciebie ciężkie podnoszenie.

Podsumowanie

JSON jest w zasadzie sposobem przekazywania danych komuś, z bardzo, bardzo szczegółowymi zasadami. Korzystanie z par kluczowych wartości i tablic. To jest wyjaśniona koncepcja, w tym miejscu warto przeczytać szczegółowe zasady powyżej.

BKSpurgeon
źródło
48

W skrócie - JSON jest sposobem serializacji w taki sposób, że staje się kodem JavaScript. Po wykonaniu (z eval lub w inny sposób) ten kod tworzy i zwraca obiekt JavaScript, który zawiera dane serializowane. Jest to dostępne, ponieważ JavaScript umożliwia następującą składnię:

var MyArray = [ 1, 2, 3, 4]; // MyArray is now an array with 4 elements
var MyObject = {
    'StringProperty' : 'Value',
    'IntProperty' : 12,
    'ArrayProperty' : [ 1, 2, 3],
    'ObjectProperty' : { 'SubObjectProperty': 'SomeValue' }
}; // MyObject is now an object with property values set.

Możesz użyć tego do kilku celów. Po pierwsze, jest to wygodny sposób na przesyłanie danych z zaplecza serwera do kodu JavaScript. Dlatego jest to często używane w AJAX.

Możesz go również użyć jako samodzielnego mechanizmu serializacji, który jest prostszy i zajmuje mniej miejsca niż XML. Istnieje wiele bibliotek, które umożliwiają serializację i deserializację obiektów w JSON dla różnych języków programowania.

Vilx-
źródło
31

Krótko mówiąc, jest to notacja skryptowa do przekazywania danych. W pewnym sensie alternatywa dla XML, natywnie obsługująca podstawowe typy danych, tablice i tablice asocjacyjne (pary nazwa-wartość, zwane Obiektami, ponieważ to one reprezentują).

Składnia jest używana w JavaScript, a sam JSON oznacza „JavaScript Object Notation”. Jednak stał się przenośny i jest używany również w innych językach.

Przydatny link do szczegółów znajduje się tutaj:

http://secretgeek.net/json_3mins.asp

mson
źródło
19

Format JSON jest często używany do serializacji i przesyłania danych strukturalnych przez połączenie sieciowe. Służy głównie do przesyłania danych między serwerem a aplikacją internetową, służąc jako alternatywa dla XML.

Pinakin Nayi
źródło
16

JSON to JavaScript Object Notation. Jest to znacznie bardziej kompaktowy sposób przesyłania zestawów danych między połączeniami sieciowymi w porównaniu do XML. Sugeruję, aby JSON był używany we wszystkich aplikacjach podobnych do AJAX, gdzie XML byłby w przeciwnym razie „zalecaną” opcją. Szczegółowość XML wydłuży czas pobierania i zwiększy zużycie przepustowości ($$$). Ten sam efekt można osiągnąć za pomocą JSON, a jego narzut jest prawie wyłącznie poświęcony samym danym, a nie podstawowej strukturze.

Nolte
źródło
11

powszechna krótka odpowiedź brzmi: jeśli używasz AJAX do wysyłania żądań danych, możesz łatwo wysyłać i zwracać obiekty jako ciągi JSON. Dostępne rozszerzenia do obsługi JavaScript wywołania toJSON () dla wszystkich typów javascript do wysyłania danych do serwera w żądaniu AJAX. Odpowiedzi AJAX mogą zwracać obiekty jako ciągi JSON, które można konwertować na obiekty JavaScript za pomocą prostego wywołania eval, np. Jeśli funkcja AJAX zwróciła jakąś funkcję AjaxFunctionCallReturningJson

"{ \"FirstName\" : \"Fred\", \"LastName\" : \"Flintstone\" }"

możesz pisać w JavaScript

var obj = eval("(" + someAjaxFunctionCallReturningJson().value + ")");
alert(obj.FirstName);
alert(obj.LastName);

JSON może być również używany do ładunków usług sieciowych i innych, ale jest to naprawdę wygodne dla wyników AJAX.

  • Aktualizacja (dziesięć lat później): nie rób tego, użyj JSON.parse
Steven A. Lowe
źródło
1
Dzięki eval () wszystko zostanie ocenione. to ryzyko bezpieczeństwa.
Thomas Weller,
@ThomasWeller tak, ta odpowiedź jest starożytna, wybrałbym JSON.parse teraz dzięki!
Steven A. Lowe,
8

Lubię JSON głównie dlatego, że jest tak zwięzły . W przypadku treści internetowych, które można zgzipować, niekoniecznie jest to wielka sprawa (stąd dlaczego x html jest tak popularny). Ale są sytuacje, w których może to być korzystne.

Na przykład dla jednego projektu przesyłałem informacje, które musiały zostać zserializowane i przesłane za pośrednictwem XMPP . Ponieważ większość serwerów ograniczy ilość danych, które można przesłać w jednym komunikacie, uznałem, że pomocne jest użycie JSON zamiast oczywistej alternatywy, XML.

Jako dodatkowy bonus, jeśli znasz język Python lub JavaScript, już znasz JSON i możesz go interpretować bez większego przeszkolenia.

Jason Baker
źródło
8

Co to jest JSON?

JavaScript Object Notation (JSON) to lekki format wymiany danych inspirowany literałami obiektowymi JavaScript.

Wartości JSON mogą składać się z:

obiekty (kolekcje par nazwa-wartość) tablice (uporządkowane listy wartości) ciągi (w podwójnych cudzysłowach) liczby true, false lub null

JSON jest niezależny od języka.

JSON z PHP?

Po wersji PHP 5.2.0 rozszerzenie JSON jest domyślnie dekodowane i koduje funkcje.

Json_encode - zwraca reprezentację JSON wartości Json_decode - Dekoduje ciąg JSON Json_last_error - Zwraca ostatni występujący błąd.

Składnia i reguły JSON?

Składnia JSON pochodzi ze składni notacji obiektowych JavaScript:

Dane znajdują się w parach nazwa / wartość Dane są oddzielone przecinkami Nawiasy klamrowe przechowują obiekty Nawiasy kwadratowe przechowują tablice

Elangovan
źródło
4

Musimy zrobić projekt na studiach i napotkaliśmy bardzo duży problem, który nazywa się Polityką Same Pochodzenia. Między innymi sprawia, że ​​twoja metoda XMLHttpRequest z Javascript nie może wysyłać żądań do domen innych niż domena, w której znajduje się twoja strona.

Na przykład nie możesz złożyć wniosku na www.otherexample.com, jeśli Twoja witryna znajduje się na www.example.com. JSONRequest pozwala na to, ale otrzymasz wynik w formacie JSON, jeśli strona na to pozwala (na przykład ma usługę internetową, która zwraca wiadomości w JSON). To jest jeden problem, w którym mógłbyś użyć JSON.

Oto coś praktycznego: Yahoo JSON

gljivar
źródło
4

Różnica między JSON a konwencjonalną składnią byłaby następująca (w JavaScript)

Standardowy

 function Employee(name, Id, Phone, email){

      this.name = name;
      this.Id = Id;
      this.Phone = Phone;
      this.email = email;
  }

  //access or call it as 

var Emp = new Employee("mike","123","9373849784","[email protected]");

Z JSON

jeśli użyjemy JSON, możemy zdefiniować w inny sposób jako

  function Employee(args){

   this.name = args.name;
   this.Id = args.Id;
   this.Phone = args.Phone;
   this.email = args.email;
}

//now access this as...

var Emp = new Employee({'name':'Mike', 'Id':'123', 'Phone':'23792747', 'email':'[email protected]'});

Ważną rzeczą, o której musimy pamiętać jest to, że jeśli musimy zbudować klasę lub modal „Pracownik” ze 100 elementami bez metody JSON, musimy parsować wszystko podczas tworzenia klasy. Ale dzięki JSON możemy zdefiniować obiekty wstawiane tylko wtedy, gdy zostanie zdefiniowany nowy obiekt dla klasy.

więc ten wiersz poniżej to sposób robienia rzeczy z JSON (prosty sposób definiowania rzeczy)

 var Emp = new Employee({'name':'Mike', 'Id':'123', 'Phone':'23792747', 'email':'[email protected]'});
Ganesh Vellanki
źródło
2
To nie jest dokładnie JSON - to obiekt JavaScript (nie JSON)
Ben Aubin
4

Czasami podaje się szczegóły techniczne tam, gdzie nie są one wymagane, i chociaż wiele z najczęściej głosowanych odpowiedzi jest dokładnie technicznych i szczegółowych, osobiście nie sądzę, aby były łatwiejsze do zrozumienia lub zwięzłe, jak można znaleźć na Wikipedii lub w oficjalna dokumentacja.

Sposób, w jaki lubię myśleć o JSON, jest dokładnie taki, jaki jest - język w świecie różnych języków. Różnica między JSON a innymi językami polega jednak na tym, że „wszyscy” mówią „JSON” wraz z ich „językiem ojczystym”.

Na przykładzie z prawdziwego świata, udawajmy, że mamy trzy osoby. Jedna osoba mówi Igbo jako językiem ojczystym. Druga osoba chciałaby wejść w interakcję z pierwszą osobą, jednak pierwsza osoba mówi jorubę jako swój pierwszy język.

Co możemy zrobić?

Na szczęście trzecia osoba w naszym przykładzie dorastała mówiąc po angielsku, ale zdarza się również, że mówi zarówno Igbo, jak i Joruba jako drugie języki, a zatem może działać jako pośrednik między dwiema pierwszymi osobami.

W świecie programowania pierwszą „osobą” jest Python, drugą „osobą” jest Ruby, a trzecią „osobą” jest JSON, który akurat jest w stanie „przetłumaczyć” Ruby na Python i odwrotnie! Oczywiście ta analogia nie jest idealna, ale jako osoba dwujęzyczna uważam, że łatwo jest sprawdzić, jak JSON współdziała z innymi językami programowania.

Jerel
źródło
2

To jest bardzo proste. JSON oznacza Java Script Object Notation. Potraktuj to jako alternatywę do używania XML do przesyłania danych między komponentami oprogramowania.

Na przykład niedawno napisałem kilka usług internetowych, które zwróciły JSON, a niektórzy programiści Javascript napisali kod, który wywołał usługi i wykorzystał informacje zwrócone w tym formacie.

Jon
źródło
2

JSON (notacja obiektowa JavaScript) to lekki format danych do wymiany / przesyłania danych. Jest w parze wartości kluczowych, tak jak JavaScript. W przypadku interfejsu API REST jest szeroko stosowany do przesyłania danych z serwera do klienta. Obecnie korzysta z tego wiele serwisów społecznościowych. Chociaż nie widzę tego tak solidnego jak XML w odniesieniu do typów danych. XML ma bardzo bogate typy danych i XSD. JSONowi brakuje tego trochę.

Dla tej samej ilości danych łańcuchowych JSON będzie lżejszy w porównaniu do XML, ponieważ XML ma wszystkie tagi otwierające i zamykające itp.

Shailendra Singh
źródło
0

W kontekście Javy jednym z powodów, dla których JSON może chcieć być użyty, jest to, że stanowi on bardzo dobrą alternatywę dla frameworku Serialization Javy, który (historycznie) jest narażony na dość poważne luki.

Joshua Bloch omawia to szczegółowo w punkcie 85 „Preferuj alternatywy dla serializacji Java” (Effective Java 3rd Edition)

Serializacja Javy początkowo miała na celu przetłumaczenie struktur danych na format, który można łatwo przesyłać lub przechowywać. JSON spełnia ten wymóg, bez poważnych exploitów, o których mowa powyżej.

johnm
źródło
-3

Wypróbuj następujący kod, aby przeanalizować odpowiedź php json: read.php

<script
  src="https://code.jquery.com/jquery-3.2.1.min.js"
  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
  crossorigin="anonymous"></script>
<script type="text/javascript">  
$.ajax({
    url:'index.php',
    data:{},
    type:"POST",
    success:function(result) {
        jsondecoded = $.parseJSON(result);
        $.each(jsondecoded, function(index, value) {
            $("#servers").text($("#servers").text() + " " + value.servername);
            console.log(value.start);
            console.log(value.end);
            console.log(value.id);
        });
    },
    statusCode: {
    404: function() {
      alert( "page not found" );
    }
  }
});
</script>

server.php

<?php 
echo '[{"start":"2017-08-29","end":"2017-09-01","id":"22"},{"start":"2017-09-03","end":"2017-09-06","id":"23"}]';
?>
amit rawat
źródło
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Nic3500,