Json firkantede parenteser. Introduktion til JSON

I denne artikel vil jeg tale om tekstdataudvekslingsformatet - JSON, og specifikt om at arbejde med dette format i PHP.

JSON er et kompakt tekstdataformat. Det kan bruges både i inog til lagring af information i en struktureret form.

JSON( engelsk JavaScript-objektnotation) er et tekstbaseret dataudvekslingsformat baseret på JavaScript og almindeligvis brugt med dette sprog. Som mange andre tekstformater er JSON let at læse af mennesker.

På trods af dets oprindelse i JavaScript (mere præcist, fra en undergruppe af sproget i 1999 ECMA-262-standarden), betragtes formatet som sproguafhængigt og kan bruges med næsten ethvert programmeringssprog. For mange sprog er der færdiglavet kode til oprettelse og behandling af data i JSON-format.

De praktiske fordele ved at bruge JSON afsløres, når du bruger AJAX-teknologi. JSON-formatet er mere kortfattet og læsbart end XML og er indbygget i Javascript. Derudover er det muligt at indsætte fuldt funktionelle funktioner i JSON-koden.

Ja, det er i AJAX-teknologien, efter min mening, dens hovedapplikation er. Da AJAX-teknologi involverer at sende en klientanmodning til serveren. Derefter behandles anmodningen på serveren, og resultatet sendes som svar til klienten.

Datatype i JSON-format

JSON understøtter alle større dataformater: strenge, tal, booleaner, samt arrays og objekter (nøgle:værdi-kombinationer adskilt af kommaer og omgivet af krøllede klammer).

Her er et eksempel på datarepræsentation i JSON-format:

("id":"1","name":"ivan","country":"Rusland","kontor":["yandex","ledelse"])

Lad os se på, hvad denne linje kan formidle: en person med navnet "ivan", under identifikationen "1", der bor i landet "Rusland" arbejder i virksomheden "yandex" i "ledelse" -afdelingen.

Lad os give et andet eksempel. Siden har en feedbackformular ved hjælp af AJAX-teknologi. Den besøgende udfylder oplysningerne, og derefter sendes de til serveren til verifikation; hvis der ikke findes nogen fejl, gemmes informationen i databasen, og der sendes et svar, der indikerer vellykket lagring. Men hvis der findes fejl, returneres et svar med fejltyper.

Eksempel på fejlsvar i JSON-format:

("error":"1","errorcode":["empty_pers","empty_mail","empty_phone","empty_letter","empty_scode"])

Hvilket for eksempel betyder:

  • Du skal udfylde feltet "Kontaktperson".
  • Du skal udfylde feltet "E-mail".
  • Du skal udfylde feltet "Telefon".
  • Indtast beskedtekst
  • Du skal udfylde feltet "Nummer på billedet".

Hvis der ikke er nogen fejl, returneres svaret:

("fejl":"0")

Hvilket indikerer vellykket afsendelse af data.

I PHP bruges JSON-udvidelsen til at repræsentere data i JSON-format. I PHP-versioner ældre end 5.2.0 er JSON-understøttelse indbygget i kernen; i tidligere versioner skal du inkludere en ekstra fil med funktioner i dit script.

Så i PHP er to funktioner ansvarlige for at arbejde med data i JSON-format: json_encode() og json_decode() .

Konvertering af data til JSON-format $json_data = array ("id"=>1,"name"=>"ivan","country"=>"Rusland","office"=>array("yandex","management") ); echo json_encode($json_data); Omvendt konvertering af data fra JSON-format $json_string="("id":1,"name":"ivan","country":"Rusland","office":["yandex","management"]) "; $obj=json_decode($json_string);

Nu vil $obj indeholde JSON-data oversat til et PHP-objekt, som du kan få adgang til som følger:

Ekko $obj->navn; //Viser navnet ivan echo $obj->office; //Vis yandex-virksomheden

Som du kan se, er $obj->office et array.

Foreach($obj->office som $val) echo $val;

At arbejde med JSON giver dig mulighed for at udveksle data med serveren i "ren form". Der er ingen grund til at sende store stykker HTML-kode.

Du har sikkert nogensinde hørt om JSON. Hvad er det? Hvad kan det gøre, og hvordan bruger man det?

I denne tutorial vil vi dække det grundlæggende i JSON og dække følgende punkter:

  • Hvad er JSON?
  • Hvad bruges JSON til?
  • Hvordan opretter man en JSON-streng?
  • Et simpelt eksempel på en JSON-streng.
  • Lad os sammenligne JSON og XML.
  • Hvordan arbejder man med JSON i JavaScript og PHP?
Hvad er JSON?

JSON er en enkel, tekstbaseret måde at gemme og overføre strukturerede data på. Med en simpel syntaks kan du nemt gemme alt fra et enkelt tal til strenge, arrays og objekter i almindelig tekst. Du kan også linke arrays og objekter sammen for at skabe komplekse datastrukturer.

Når først JSON-strengen er oprettet, er det nemt at sende den til en anden applikation eller til en anden placering på netværket, fordi det er almindelig tekst.

JSON har følgende fordele:

  • Den er kompakt.
  • Dens sætninger er lette at læse og komponere af både mennesker og computere.
  • Det kan nemt konverteres til en datastruktur for de fleste programmeringssprog (tal, strenge, booleaner, arrays osv.)
  • Mange programmeringssprog har funktioner og biblioteker til at læse og skabe JSON-strukturer.

Navnet JSON står for JavaScript Object Notation. Som navnet antyder, er det baseret på en måde at definere objekter (meget ligesom at skabe associative arrays på andre sprog) og arrays.

Hvad bruges JSON til?

Den mest almindelige brug af JSON er at sende data fra serveren til browseren. Typisk leveres JSON-data ved hjælp af AJAX, som gør det muligt for browseren og serveren at kommunikere uden at skulle genindlæse siden.

  • Brugeren klikker på et produkt-thumbnail i en netbutik.
  • JavaScript, der kører på browseren, genererer en AJAX-anmodning til PHP-scriptet, der kører på serveren, og sender ID'et for det valgte produkt ind.
  • PHP-scriptet henter produktnavn, beskrivelse, pris og andre oplysninger fra databasen. Derefter komponerer den en JSON-streng fra dataene og sender den til browseren.
  • JavaScript, der kører på browseren, modtager JSON-strengen, afkoder den og viser produktinformationen på siden for brugeren.
  • Du kan også bruge JSON til at sende data fra browseren til serveren ved at sende en JSON-streng som parameter til GET- eller POST-anmodninger. Men denne metode er mindre almindelig, da dataoverførsel gennem AJAX-anmodninger kan forenkles. For eksempel kan produkt-id'et inkluderes i URL'en som en del af en GET-anmodning.

    jQuery-biblioteket har flere metoder, såsom getJSON() og parseJSON(), der gør det nemt at hente data ved hjælp af JSON gennem AJAX-anmodninger.

    Hvordan opretter man en JSON-streng?

    Der er et par grundlæggende regler for at oprette en JSON-streng:

    • JSON-strengen indeholder enten en matrix af værdier eller et objekt (en associativ matrix af navn/værdi-par).
    • Array er omgivet af firkantede parenteser ([ og ]) og indeholder en kommasepareret liste over værdier.
    • Et objekt er omgivet af krøllede klammeparenteser (( og )) og indeholder en kommasepareret liste over navn/værdi-par.
    • navn/værdipar består af feltnavnet omgivet af dobbelte anførselstegn, efterfulgt af et kolon (:) og feltværdien.
    • Betyder i en matrix eller et objekt kan der være:
      • Tal (heltal eller flydende komma)
      • Streng (i dobbelte anførselstegn)
      • Boolesk værdi (sand eller falsk)
      • Et andet array (omsluttet i firkantede parenteser)
      • Et andet objekt (omsluttet af krøllede seler)
      • null værdi

    For at inkludere dobbelte anførselstegn i en streng skal du bruge en omvendt skråstreg: \" . Som med mange programmeringssprog kan du sætte kontroltegn og hex-koder i en streng ved at sætte en skråstreg foran dem. Se JSON-webstedet for detaljer.

    Enkelt JSON streng eksempel

    Nedenfor er et eksempel på bestilling i JSON-format:

    ( "orderID": 12345, "shopperName": "Vanya Ivanov", "shopperEmail": " [e-mail beskyttet]", "contents": [ ( "productID": 34, "productName": "Superprodukt", "quantity": 1 ), ( "productID": 56, "productName": "Miracle product", "quantity": 3 ) ], "ordreCompleted": true )

    Lad os se på linjen i detaljer:

    • Vi opretter et objekt ved hjælp af krøllede seler (( og )).
    • Objektet har flere navn/værdi-par: "orderID": 12345 En egenskab med navnet "orderId" og en heltalsværdi 12345 "shopperName": "Vanya Ivanov" en egenskab med navnet "shopperName" og strengværdien "Vanya Ivanov" " "shopperEmail": " [e-mail beskyttet]" En ejendom med navnet "shopperEmail" med en strengværdi " [e-mail beskyttet]" "contents": [ ... ] En egenskab ved navn "contents", hvis værdi er en matrix "orderCompleted": true En egenskab ved navn "orderCompleted" og den boolske værdi true
    • Der er 2 objekter i "indholds"-arrayet, der repræsenterer individuelle elementer i rækkefølgen. Hvert objekt indeholder 3 egenskaber: productID , productName , og quantity .

    Forresten, da JSON er baseret på at deklarere JavaScript-objekter, kan du hurtigt og nemt gøre ovenstående JSON-streng til et JavaScript-objekt:

    var cart = ( "orderID": 12345, "shopperName": "Vanya Ivanov", "shopperEmail": " [e-mail beskyttet]", "contents": [ ( "productID": 34, "productName": "Superprodukt", "quantity": 1 ), ( "productID": 56, "productName": "Miracle product", "quantity": 3 ) ], "ordreCompleted": sand );

    Sammenligning af JSON og XML

    På mange måder kan du tænke på JSON som et alternativ til XML, i det mindste i webapplikationsområdet. Konceptet AJAX var oprindeligt baseret på brugen af ​​XML til at overføre data mellem serveren og browseren. Men i de senere år er JSON blevet mere og mere populær til transport af AJAX-data.

    Mens XML er en gennemprøvet teknologi, der bruges i et rimeligt antal applikationer, har JSON fordelen af ​​at være et mere kompakt og lettere at genkende dataformat.

    Sådan ville ovenstående eksempelobjekt i XML se ud:

    ordre-ID 12345 shopperName Vanya Ivanov shopperE-mail [e-mail beskyttet] indhold produkt-ID 34 produktnavn Super produkt antal 1 produkt-ID 56 produktnavn Mirakel produkt antal 3 ordreCompleted true

    XML-versionen er væsentligt større. I virkeligheden er den 1128 tegn lang, mens JSON-versionen kun er 323 tegn lang. XML-versionen er også ret svær at forstå.

    Selvfølgelig er dette et radikalt eksempel. Og det er muligt at lave en mere kompakt XML-record. Men selv det vil være betydeligt længere end JSON-ækvivalenten.

    Arbejde med en JSON-streng i JavaScript

    JSON har et simpelt format, men det er ret kedeligt at oprette en JSON-streng manuelt. Derudover skal du ofte tage en JSON-streng, konvertere dens indhold til en variabel, der kan bruges i kode.

    De fleste programmeringssprog har værktøjer til nemt at konvertere variabler til JSON-strenge og omvendt.

    Oprettelse af en JSON-streng fra en variabel

    JavaScript har en indbygget JSON.stringify()-metode, der tager en variabel og returnerer en JSON-streng, der repræsenterer dens indhold. Lad os for eksempel oprette et JavaScript-objekt, der indeholder ordreoplysningerne fra vores eksempel, og derefter oprette en JSON-streng ud fra det:

    var cart = ( "orderID": 12345, "shopperName": "Vanya Ivanov", "shopperEmail": " [e-mail beskyttet]", "contents": [ ( "productID": 34, "productName": "Superprodukt", "quantity": 1 ), ( "productID": 56, "productName": "Miracle product", "quantity": 3 ) ], "ordreCompleted": true ); alert (JSON.stringify(cart));

    Denne kode vil producere:

    Bemærk, at metoden JSON.stringify() returnerer en JSON-streng uden mellemrum. Den er sværere at læse, men den er mere kompakt til transmission over netværket.

    Der er flere måder at parse en JSON-streng i JavaScript, men den sikreste og mest pålidelige er at bruge den indbyggede JSON.parse()-metode. Den modtager en JSON-streng og returnerer et JavaScript-objekt eller et array, der indeholder dataene. For eksempel:

    var jsonString = " \ ( \ "orderID": 12345, \ "shopperName": "Vanya Ivanov", \ "shopperEmail": " [e-mail beskyttet]", \ "contents": [ \ ( \ "productID": 34, \ "productName": "Superprodukt", \ "antal": 1 \), \ ( \ "productID": 56, \ "productName": "Mirakelvarer", \"mængde": 3\ ) \ ], \"ordreCompleted": true \ ) \"; var cart = JSON.parse(jsonString); alert(cart.shopperEmail); alert(cart.contents.productName);

    Vi oprettede en jsonString-variabel, der indeholder JSON-strengen i vores eksempelrækkefølge. Vi sender derefter denne streng til metoden JSON.parse(), som opretter et objekt, der indeholder JSON-dataene og gemmer dem i kurvvariablen. Det eneste, der er tilbage, er at kontrollere ved at vise egenskaberne for shopperEmail-objektet og produktnavnet for indholdsmatrixen.

    Som et resultat vil vi få følgende output:

    I et rigtigt program vil din JavaScript-kode modtage ordren som en JSON-streng i et AJAX-svar fra serverscriptet, sende strengen til metoden JSON.parse() og derefter bruge dataene til at vise dem på brugerens side.

    JSON.stringify() og JSON.parse() har andre muligheder, såsom at bruge tilbagekaldsfunktioner til at tilpasse bestemte data. Sådanne muligheder er meget nyttige til at konvertere forskellige data til rigtige JavaScript-objekter.

    Arbejder med en JSON-streng i PHP

    PHP har ligesom JavaScript indbyggede funktioner til at arbejde med JSON-strenge.

    Oprettelse af en JSON-streng fra en PHP-variabel

    Funktionen json_encode() tager en PHP-variabel og returnerer en JSON-streng, der repræsenterer indholdet af variablen. Her er vores ordreeksempel skrevet i PHP:

    Denne kode returnerer nøjagtig den samme JSON-streng som i JavaScript-eksemplet:

    ("orderID":12345,"shopperName":"Vanya Ivanov","shopperEmail":" [e-mail beskyttet]","contents":[("productID":34,"productName":"Superprodukt","quantity":1),("productID":56,"productName":"Miracle product","quantity": 3)],"ordreCompleted":true)

    I en rigtig applikation vil dit PHP-script sende denne JSON-streng som en del af et AJAX-svar til browseren, hvor JavaScript-koden ved hjælp af JSON.parse()-metoden vil parse den tilbage til en variabel til visning på brugerens side .

    Du kan sende forskellige flag som det andet argument til funktionen json_encode(). Med deres hjælp kan du ændre principperne for kodning af indholdet af variable til en JSON-streng.

    Opret en variabel fra en JSON-streng

    For at konvertere en JSON-streng til en PHP-variabel skal du bruge metoden json_decode(). Lad os erstatte vores eksempel for JavaScript med metoden JSON.parse() med PHP-kode:

    Som med JavaScript vil denne kode producere:

    [e-mail beskyttet] Mirakel produkt

    Som standard returnerer funktionen json_decode() JSON-objekter som PHP-objekter. Der er generiske PHP-objekter af stdClass-klassen. Det er derfor, vi bruger -> til at få adgang til objektets egenskaber i eksemplet ovenfor.

    Hvis du har brug for et JSON-objekt som et tilknyttet PHP-array, skal du sende true som det andet argument til funktionen json_decode(). For eksempel:

    $cart = json_decode($jsonString, sand); echo $cart["shopperEmail"] . "
    "; echo $cart["indhold"]["produktnavn"] . "
    ";

    Denne kode vil producere det samme output:

    [e-mail beskyttet] Mirakel produkt

    Du kan også sende andre argumenter til funktionen json_decode() for at angive rekursionsdybden og hvordan man håndterer store heltal.

    Konklusion

    Selvom JSON er let at forstå og bruge, er det et meget nyttigt og fleksibelt værktøj til overførsel af data mellem applikationer og computere, især når du bruger AJAX. Hvis du planlægger at udvikle en AJAX-applikation, så er der ingen tvivl om, at JSON bliver et væsentligt værktøj i dit værksted.

    ), og mellem serverne selv (HTTP-softwaregrænseflader). JSON-formatet er også velegnet til lagring af komplekse dynamiske strukturer i relationelle databaser eller filcaches.

    Da JSON er et undersæt af JavaScript-syntaks, kan det hurtigt deserialiseres ved hjælp af den indbyggede eval()-funktion. Derudover er det muligt at indsætte fuldt funktionelle JavaScript-funktioner. I PHP, starter med version 5.2.0, er JSON-understøttelse inkluderet i kernen i form af funktionerne json_decode() og json_encode(), som selv konverterer JSON-datatyper til de tilsvarende PHP-typer og omvendt.

    Syntaks

    JSON er bygget på to strukturer:

    • Et sæt nøgle/værdi-par. På forskellige sprog er dette implementeret som et objekt, post , struktur , ordbog , hash tabel , nøgleliste eller associativ array . Nøglen kan kun være en streng, værdien kan kun være en hvilken som helst form.
    • Et nummereret sæt værdier. På mange sprog er dette implementeret som array, vektor, liste eller sekvens.

    Disse er universelle datastrukturer. I teorien understøtter alle moderne programmeringssprog dem i en eller anden form. Da JSON bruges til at udveksle data mellem forskellige programmeringssprog, giver det mening at bygge det på disse strukturer.

    Følgende formularer bruges i JSON:

    • Et objekt er et uordnet sæt navne-/værdipar omgivet af krøllede klammer ( ). Der er et symbol mellem navn og værdi ": " , og navn/værdi-par er adskilt med kommaer.
    • Et array (endimensionelt) er et sæt værdier, der har serienumre (indekser). Arrayet er omgivet af firkantede parenteser. Værdier er adskilt med kommaer.
    • Værdien kan være linje i dobbelte anførselstegn, nummer, værdi rigtigt eller falsk, objekt, array eller værdi nul. Disse strukturer kan indlejres i hinanden.
    • En streng er et ordnet sæt af nul eller flere Unicode-tegn, omgivet af dobbelte anførselstegn, ved hjælp af escape-sekvenser med omvendt skråstreg. Tegnene er repræsenteret som en simpel streng.
    • Navnet er en streng.

    Linje meget lig en streng i sprogene og Java. Nummer også meget lig et C- eller Java-tal, bortset fra at der kun bruges decimalformat. Mellemrum kan indsættes mellem to vilkårlige tegn.

    Følgende eksempel viser en JSON-repræsentation af et objekt, der beskriver en person. Objektet har snor for- og efternavnsfelter, et objekt, der beskriver adressen, og et array, der indeholder en liste over telefonnumre.

    ( "firstName" : "Ivan" , "lastName" : "Ivanov" , "address" : ( "streetAddress" : "Moskovskoe sh., 101, apt. 101" , "city" : "Leningrad" , "postalCode" : 101101 ), "phoneNumbers" : [ "812 123-1234", "916 123-4567" ] )

    I XML ville en sådan struktur se sådan ud:

    Ivan Ivanov Moskovskoe sh., 101, lejlighed 101 Leningrad 101101 812 123-1234 916 123-4567

    812 123-1234 916 123-4567

    Sammenligning med YAML

    Både funktionelt og syntaktisk er JSON en delmængde af YAML-sproget. Specifikt angiver YAML 1.2-specifikationen, at "enhver JSON-fil er en gyldig YAML-fil." Den mest almindelige YAML-parser kan også behandle JSON. YAML-specifikationen før version 1.2 dækkede ikke fuldt ud JSON, primært på grund af manglen på indbygget understøttelse af UTF-32 i YAML, samt kravet om et mellemrum efter kommaafgrænseren. Derudover inkluderede JSON-specifikationen /* */ stilkommentarer.

    Den vigtigste forskel i YAML er sættet af syntaksudvidelser, der ikke har nogen analoger i JSON:

    Relationel: YAML understøtter relationelle data: i et YAML-dokument kan du henvise til et anker, der opstod tidligere i en fil/strøm. Rekursive strukturer kan udtrykkes på denne måde. Udvidelig: YAML understøtter udvidelige datatyper ud over primitiver (dvs. strenge, tal, booleaner). Blokke: YAML tilbyder indrykket bloksyntaks; det giver dig mulighed for at beskrive strukturerede data uden at bruge unødvendige symboler (alle slags parenteser, citater osv.).

    JSON-skema

    JSON Schema er et af sprogene til at beskrive strukturen af ​​et JSON-dokument. Bruger JSON-syntaks. Baseret på begreberne XML Schema, RelaxNG, Kwalify. JSON Schema er et selvbeskrivende sprog: når det bruges, kan de samme serialiserings-/deserialiseringsværktøjer bruges til at behandle data og beskrive dets gyldighed.

    Bruger JSON i Ajax

    Det følgende eksempel på Javascript-kode viser, hvordan en browser kan bruge XMLHttpRequest til at anmode om et JSON-formateret objekt fra serveren (serversiden af ​​programmet er udeladt; den skal indeholde koden, der sender dataene som en JSON-streng som svar på anmodninger af url).

    Var det_objekt; var http_request = new XMLHttpRequest() ; http_request.open("GET", url, sand); http_request.send(null); http_request.onreadystatechange = function () ( if ( http_request.readyState == 4 ) ( if ( http_request.status == 200 ) ( the_object = JSON.parse ( http_request.responseText ) ; ) else ( alert( "Der var et problem med URL'en." ) ; ) http_request = null ; ) ) ;

    Bemærk, at dette eksempel på brug af XMLHttpRequest ikke er universelt for alle browsere (for browsere baseret på Internet Explorer, Opera, Safari og Mozilla bør der være nogle forskelle i koden). Brugen af ​​XMLHttpRequest er begrænset på grund af den samme oprindelsespolitik: URL'en for svaret på anmodningen skal være i det samme DNS-domæne som serveren, hvor den side, der anmoder om svaret, er placeret. Et alternativ er JSONP-tilgangen, som involverer brug af et kodet funktionskald, der sendes mellem klienten og serveren, så klienten kan indlæse JSON-kodede data fra tredjepartsdomæner og underrette den, der ringer om færdiggørelsen, selvom dette introducerer nogle sikkerhedsrisici og yderligere serverkrav.

    Alternativt kan sidekoden bruge elementer til asynkront at anmode om JSON-data, eller blot . Disse tilgange var almindelige, før udbredt støtte til XMLHttpRequest var tilgængelig.

    Du kan også bruge den samme oprindelsespolitik til at overføre JSON-data ved hjælp af dynamiske tags, men dette resulterer i sårbar kode. Som et mere sikkert alternativ er det blevet foreslået at bruge det JSONRequest.

    Sikkerhedsspørgsmål

    Selvom JSON er designet til at transmittere data i en serialiseret form, følger dens syntaks JavaScript-syntaksen, og dette skaber en række sikkerhedsproblemer. Ofte, for at behandle data modtaget fra en ekstern kilde i JSON-format, anvendes eval()-funktionen på den uden nogen foreløbig validering.

    JavaScript eval()

    Fordi JSON ser ud til at være et syntaktisk korrekt stykke JavaScript-kode, er den enkleste måde at parse JSON-data i et JavaScript-program på at bruge den indbyggede JavaScript eval()-funktion, som er designet til at udføre JavaScript-udtryk. Med denne tilgang er der ingen grund til at bruge yderligere parsere.

    Teknikken eval() gør systemet sårbart, hvis kilden til de anvendte JSON-data ikke er tillid til ( engelsk). Sådanne data kan være ondsindet JavaScript-kode til Code Injection-angreb ( engelsk). Ved at bruge denne sårbarhed er det muligt at stjæle data og forfalske godkendelse. Sårbarheden kan dog elimineres ved at bruge yderligere datavalideringsværktøjer. For eksempel, før udførelse af eval(), kan data modtaget fra en ekstern kilde valideres ved hjælp af regulære udtryk. RFC'en, der definerer JSON, foreslår at bruge følgende kode for at kontrollere, om den er i overensstemmelse med JSON-formatet

    Var mit_JSON_objekt = ! (/[^,:()\[\]0-9.\-+Eaeflnr-u \n\r\t]/ .test ( text.replace (/"(\\.|[^"\\] )*"/g , "" ) ) ) && eval("(" + tekst + ")" );

    Som et mere sikkert alternativ til eval() er der foreslået en ny funktion, parseJSON(), som kun kan behandle JSON-data. Det blev introduceret i version 4 af ECMAScript-standarden og er beskrevet i artiklen "JSON: A Low-Fat Alternative to XML". Det er i øjeblikket tilgængeligt som et JavaScript-bibliotek og vil blive inkluderet i den femte udgave af ECMAScript.

    Indlejret JSON

    Nyere versioner af webbrowsere har indbygget understøttelse af JSON og er i stand til at behandle det uden at kalde eval()-funktionen, hvilket fører til det beskrevne problem. JSON-behandling er normalt hurtigere i dette tilfælde. Så i juni 2009 havde følgende browsere indbygget JSON-understøttelse:

    Mindst fem populære JavaScript-biblioteker bruger inline JSON, når de er tilgængelige:

    Forfalskning af anmodninger på tværs af domæner

    Dårlig brug af JSON gør websteder sårbare over for forfalskning af anmodninger på tværs af websteder (CSRF eller XSRF). Fordi tagget tillader brugen af ​​en kilde, der ikke tilhører det samme domæne som ressourcen, der bruger det, tillader det, at kode udføres under dække af JSON-data i sammenhæng med en vilkårlig side, hvilket gør det muligt at kompromittere adgangskoder eller andre følsomme oplysninger om brugere, der er godkendt på siden, et andet websted.

    Dette ser kun ud til at være et problem, hvis JSON-dataene indeholder følsomme oplysninger, der kan blive kompromitteret af en tredjepart, og hvis serveren er afhængig af en enkelt-oprindelsespolitik ( engelsk), blokerer adgangen til data, når en ekstern anmodning detekteres. Dette er ikke et problem, hvis serveren bestemmer gyldigheden af ​​anmodningen, og leverer kun data, hvis de er korrekte. HTTP-cookies kan ikke bruges til at bestemme dette. Den eksklusive brug af HTTP-cookies bruges af forfalskning af anmodninger på tværs af websteder.

    JSONP & JSONPP

    JSONP (JSON Padding) eller "JSON with padding" er en udvidelse af JSON, når navnet på en tilbagekaldsfunktion er angivet som et input-argument.

    Teknologien er baseret på, at browserens sikkerhedspolitik tillader brugen af ​​tagget til at få adgang til andre servere end den server, hvorfra siden blev indlæst.

    Uden at bruge JSONP-teknologi (det vil sige kun at bruge JSON-datakodning), kan serveren kun returnere data. For eksempel sådan her:

    ("papir": "A4", "antal": 5)

    Dette er dog kun data og kan ikke påvirke browseren.

    Ved at bruge JSONP-teknikken videregives navnet på tilbagekaldsfunktionen til tredjepartsserveren i opkaldslinjen (GET):

    Her indeholder jsonp-parameteren navnet på tilbagekaldsfunktionen parseResponse.

    Nu kan den udenlandske server example.com returnere følgende kode:

    ParseResponse(( "paper" : "A4" , "count" : 5 ) )

    Koden kalder nu det første domænes javascript-funktion.

    Ideen blev oprindeligt foreslået på MacPython-bloggen i 2005 og bruges i øjeblikket af mange Web 2.0-applikationer såsom Dojo Toolkit Applications, Google Toolkit Applications og zanox Web Services. Yderligere udvidelser til denne protokol er blevet foreslået for at inkludere yderligere argumenter, såsom JSONPPs understøttelse af S3DB-webtjenester.

    Fordi JSONP bruger script-tags, er opkald i det væsentlige åbne for verden. Af denne grund kan JSONP være uegnet til lagring af følsomme data.

    Aktivering af script-tags fra eksterne websteder giver dem mulighed for at overføre alt indhold på webstedet. Hvis det eksterne websted har sårbarheder, der tillader Javascript-injektion, kan det oprindelige websted også blive påvirket af dem.

    JSONPP (parameteriseret JSON med polstring) Parameteriseret JSON med polstring - udvikling af JSONP-ideen

    JSONPP inkluderer kilde-URL'en, navnet på den funktion, der skal behandle JSON-dataene, en linje til eval efter modtagelse af dataene og en linje til eval efter endt behandling af dataene:

    JSON_call(SRC, JSONP, JSONPP, ONLOAD);

    vender til sidst om

    Ans = JSONP(SRC) ( eval(JSONPP(ans) ); eval(ONLOAD) ; )

    Generelt er antallet af parametre ikke vigtigt for selve JSONPP-ideen. SRC, JSONP, JSONPP (og deres behandling på serversiden og derefter på klientsiden) er nok til at det er JSONPP.

    Lad os se på eksemplet med at arbejde med S3DB-tjenesten.

    Funktion s3db_jsonpp_call(src, next_eval) ( var call = "call_" + Math .random () .toString () .replace (/\./g, "" ); var headID = document.getElementsByTagName ("head") [ 0 ] ; var script = document.createElement ("script" ); script.id = call; script.type = "text/javascript" ; // ved hjælp af polstret, parameteriseret json src = src+ "&format=json&jsonp=s3db_jsonpp&jsonpp=" + next_eval+ "&onload=remove_element_by_id("" + script.id + "")" ; script.src = src; headID.appendChild (script) ; // hente svar ) funktion s3db_jsonpp(ans, jsonpp) ( eval(jsonpp); return ans ; ) funktion remove_element_by_id(id) ( var e = document.getElementById (id) ; e.parentNode .removeChild (e) ; return false ; )

    I eksemplet opretter funktionen s3db_jsonpp_call() et script-element i DOM i head-delen, hvis src svarer til JSONPP-kaldet.

    Efter at have modtaget et svar fra serveren vil s3db_jsonpp() blive kaldt - det sendes i opkaldsparametrene, som det skal være ifølge JSONP regler.

    Inde i s3db_jsonpp() vil eval(jsonpp) udløse og returnere værdien ans.

    Kaldning af eval(onload) fører til udførelse af remove_element_by_id() med id'et for det oprettede script i hovedet og i sidste ende til dets sletning, fordi det alligevel ikke vil blive brugt, da id'et i eksemplet blev genereret tilfældigt i begyndelsen af funktionen s3db_jsonpp_call() . Dette opkald er i serversvaret.

    Objektreferencer

    JSON-standarden understøtter ikke objektreferencer, men Dojo Toolkit demonstrerer, hvordan standard JSON kan understøtte sådanne referencer ved hjælp af yderligere konventioner. Især dojox.json.ref-modulet understøtter flere former for links, herunder cirkulære, multiple, inter-dokument og dovne links.

    Se også Noter
  • YAML Ain't Markup Language (YAML™) Version 1.2 (engelsk) . - Arbejdsudkast 2008-05-11.(utilgængeligt link - historie) Hentet 24. september 2009.
  • . RedHanded (07. april 2005). Hentet 25. september 2012. .
  • Json.Com JSON-skemaforslag (utilgængeligt link - historie)
  • RFC 4627
  • JSON: Det fedtfrie alternativ til XML. Arkiveret
  • json2.js (engelsk) . Arkiveret fra originalen 12. februar 2012. Hentet 24. september 2009.
  • Bruger indlejret JSON.
  • Indlejret JSON i IE8. Arkiveret fra originalen den 12. februar 2012.
  • Webspecifikationer understøttet i Opera Presto 2.5 (engelsk) (10. marts 2010). Arkiveret fra originalen 12. februar 2012. Hentet 29. marts 2010.
  • ES 3.1 implementering af JSON objekt.
  • Billet #4429lang=da . Arkiveret fra originalen den 12. februar 2012.
  • Billet #4429 (22. maj 2009). Arkiveret fra originalen 12. februar 2012. Hentet 3. juli 2009.
  • Billet #8111lang=da . Arkiveret fra originalen den 12. februar 2012.
  • MooTools Core & More 1.3.1. Arkiveret fra originalen den 12. februar 2012.
  • YUI 2: JSON-værktøj (1. september 2009). Arkiveret fra originalen 12. februar 2012. Hentet 22. oktober 2009.
  • Lær JSON (7. april 2010). Arkiveret fra originalen 12. februar 2012. Hentet 7. april 2010.
  • Jeremy Grossman Avancerede angrebsteknikker mod webapplikationer ved hjælp af Gmail. WhiteHat Sikkerhed. Arkiveret fra originalen 12. februar 2012. Hentet 23. september 2009.
  • fra __future__ import * » Remote JSON - JSONP . Bob.pythonmac.org. Arkiveret fra originalen 12. februar 2012. Hentet 8. september 2008.
  • Almeida, Jonas (11. juni 2008). "JSON, JSONP, JSONPP? "(S3DB). Hentet 2009-04-26.
  • RIAspot JSON P til Cross Site XHR .(utilgængeligt link - historie)
  • JSON-reference i Dojo. Arkiveret fra originalen den 12. februar 2012.
  • Links
    • Hjemmeside i officielt format på russisk
    • json.js, json2.js er et bibliotek udviklet af Douglas Crockford til at arbejde med JSON-data i JavaScript. Udvider et objekt med toJSONString-metoden, som derefter er til stede i ethvert objekt, og konverterer det til en JSON-formatstreng.
    • json-rpc.org (engelsk)
    DokumentmarkeringssprogOffice dokumenter

    Variabler, arrays og objekter er en velkendt og bekvem form for datarepræsentation. Det er sædvanligt at beskrive data i browsersproget JavaScript, hvilket ikke er nødvendigt i PHP-serversproget. JSON-formatet giver dig mulighed for at opsummere dem i én helhed og ikke fokusere på programmeringssproget. I dette tilfælde bliver dataene til par: "navn = værdi". Værdien i hver af dem kan også være en samling af sådanne par.

    Det er sædvanligt at forbinde JSON med krøllede seler, og sidstnævnte er ret berettiget, da JSON-formatet = JavaScript Object Notation. Meget har ændret sig i de seneste særligt dynamiske år. Det, der blev skabt til et bestemt formål, gav ofte uventede resultater eller åbnede nye horisonter.

    Dataudveksling: browser - server

    AJAX-teknologi er blevet traditionel, regelmæssig sideopdatering helt er holdt op med at være populær. En besøgende, der åbner et websted, starter en række delvise dataudvekslinger, når visse sider kun ændres på det sted, der er relevant.

    Det menes, at fremkomsten af ​​JSON er forbundet med brugen af ​​AJAX, men faktisk har associativ og dens objektnotation (funktioner i syntaksen til beskrivelse og brug af objekter) et meget mere relateret forhold til JSON end udveksling af data mellem browseren og serveren.

    Siden indholdet af siderne på moderne websteder virkelig er blevet "massivt" (voluminøst), har effektiviteten af ​​formatet til dataudveksling fået særlig betydning. Dette er ikke for at sige, at JSON er blevet en ny datarepræsentation, men det faktum, at det længe har været et element i JavaScript-syntaks, er væsentligt.

    Brugen af ​​kyrillisk i navngivning af variabler er et meget uventet fænomen (nonsens), men det virker i de nyeste versioner af Chrome, Firefox og endda Internet Explorer 11.

    Kyrillisk og JSON

    Selvfølgelig er der ingen mening i at bruge dette helt uventede fænomen og huske, hvor let værdierne af variabler skrevet med russiske bogstaver bliver til volapyk: hvad kan vi sige om navne, især eksterne.

    Det er tvivlsomt, om initiativet i kyrilliske navne vil blive understøttet af browserens eksterne miljø, som det hele tiden skal forholde sig til. Men dette faktum fortjener opmærksomhed af den simple grund, at JSON-formatet er evnen til at skrive navne og værdier, som udvikleren ønsker. Dette er vigtigt, da beskrivelsen af ​​applikationsområdet, som det kræver det, i hver opgave forenkler fejlfindingen betydeligt og reducerer antallet af fejl.

    Det er lige meget hvad grundlaget for den syntaktiske innovation - JSON - var, det er vigtigt, at det gav den juridiske ret og den reelle mulighed for at sætte korrespondancen: "ethvert navn = enhver værdi."

    Vi skal hylde JavaScript-sproget: det, der leveres af syntaksen, forpligter ikke udvikleren og pålægger ham ikke noget. Udvikleren bruger frit sprogsyntaksen til optimalt at danne en datamodel og en algoritme til deres brug.

    PHP og JSON

    Ved at acceptere data i JSON-format giver serveren (via PHP, især) mulighed for at behandle dem som de er og returnere resultatet tilbage til browseren i et lignende format. PHP kilde array:

    • $cJSON = array ("a"=> "alfa", "b"=> "beta", "g"=> "gamma").

    Konverter til JSON til levering til browser:

    • $cJS = json_encode($cJSON).

    Resultat:

    • ("a":"alfa","b":"beta","g":"gamma").

    Redningen vist på billedet er tilladt.

    Her blev det genererede array tilføjet med et nyt element "i sig selv" med det automatiske indeks "0", og derefter igen med det angivne indeks "z".

    Json_decode() konverterer en JSON-streng til et PHP-array. Lignende resultater kan opnås ved at manipulere funktioner og eksplodere(). I nogle tilfælde er denne mulighed at foretrække.

    Indlejringsniveau

    Elementer kan indlejres både på browsersiden og på serversiden. I praksis giver JSON-formatet (RFC 4627 standardbeskrivelse) betydeligt mere end 4 niveauer af indlejring, men denne funktion bør ikke misbruges.

    Det er bedst aldrig at gå ud over rimelig tilstrækkelighed; dette gør koden læsbar, hvilket gør det lettere at fejlsøge og forstå for andre udviklere.

    JSON omtales almindeligvis som datakonstruktioner, der er enklere end XML og forståelige for både mennesker og computere. Dette gælder, når mængden af ​​data er lille, og udvikleren har valgt indlejringsniveauet med omhu. I alle andre tilfælde er det svært at tælle antallet af parenteser og forstå både på browsersiden og på serversiden.

    JSON filer

    Brugen af ​​JSON i praksis er ofte ikke begrænset til en kort streng, der kan læses af mennesker. Enhver datakonstruktion er altid pragmatisk. Samtidig kan JSON effektivt bruges både i reelle opgavedata (virksomhedspersonale) og til implementering af midlertidige data (objektcache).

    Enterprise personale og JSON-format: eksempel

    Normalt er en optegnelse om én person et efternavn, fornavn, patronym, fødselsår, speciale, uddannelse, ... og et par andre simple værdier. Selv i særligt krævende virksomheder vil en rekord på én person ikke overstige et dusin eller to felter. Dette er mærkbart og kan placeres i en databasestreng.

    Hvis en virksomhed beskæftiger flere personer, er det én ting, men hvis der er titusindvis, er det helt anderledes. Du kan fortsætte med at bruge databasen, men at gemme den som en fil virker mere praktisk og tilgængelig at bruge.

    JSON er en almindelig tekstfil. Sagen med bemandingsbordet siger sig selv. Du kan altid læse den. Åbning og redigering er også tilgængelig i enhver teksteditor, der ikke har for vane at tilføje sine egne serviceoplysninger til indholdet af filen. Generelt er *.json ren tekst både inde i browseren og inde i filen - en streng.

    Billedet viser cachen for det objekt, der danner billedet, et eksempel.

    Dette er et eksempel på indholdet af en fil, der er genereret af et websted, der leverer 3D-farveprint på krus og keramik. Naturligvis er det virkelig problematisk at have sådan et JSON-format, at beslutte, hvordan man åbner det. Men i dette og lignende tilfælde er der ingen problemer med at læse filen: PHP læser filen, analyserer den og sender den til browseren. De data, der ændres af den besøgende, returneres til serveren og skrives tilbage.

    I dette tilfælde fungerer filen som en variabel, der er gemt uden for koden. Variablen modtager om nødvendigt en værdi fra filen, og hvis den ændres af den besøgende i dialogen fra siden, så vil alle ændringer blive registreret som de er. Der er ingen grund til at læse og kontrollere indholdet af filen.

    JSON bruges ofte til at gemme og bruge serviceoplysninger - dette er ikke en personaletabel, og hverken udvikleren eller den besøgende behøver at se den.

    XML og JSON

    "Der er en tid for alt" er en klassisk viden, der accepteres som et aksiom allerede før programmeringens fremkomst. "Intet dukker bare op" - dette skete også før mennesket skrev det første forståelige program på et kunstigt sprog.

    Dataformater udspringer af reelle behov og er baseret på opnået viden. HTML har sin egen sti, XML har sin egen sti, og JSON er JavaScript-objektlogik udvidet til andre sprog. At sammenligne en med en anden er ikke den bedste ting at gøre. Til hver sit.

    XML klarer sine opgaver fantastisk og kommer tydeligvis ikke til at blive historie. Og JSON blev brugt indtil 2006; det er bare, at ikke alle udviklere anså det for sin pligt at erklære visse muligheder for at repræsentere deres data.

    Der har været tilfælde i praksis, hvor programmer blev skrevet i BASIC, der ikke brugte JSON som sådan, men perfekt gemte "navn = værdi"-par og gjorde dem tilgængelige for de rigtige algoritmer på det rigtige tidspunkt.

    Specialtegn ("`", "~", "|", ...) og dataformater

    Vanen med at arbejde med associative arrays og objekter i JavaScript gør det naturligt og bekvemt at bruge JSON. Dette er et rigtig godt format, men evnen til at adskille og forbinde, manipulere strenge og arrays, har meget dybere rødder.

    Join/split-funktionerne i JavaScript-sproget og implode/explode af PHP-sproget giver dig mulighed for bekvemt og effektivt at bruge både XML, JSON-dataformater og din egen version. Sidstnævnte er ofte optimalt, mens de to første er ideelle til generelle brugsmuligheder. Hvis information bliver overført til en anden udvikler, server, fil eller database, er der ingen bedre måde at finde XML og JSON på. Alle arbejder med dem, så overførsel/modtagelse af information kræver ikke kommentarer.

    Bruger JSON i Android

    At læse og skrive data i JSON-format i Android er ikke kun normen, men der er også mange objekter, der fokuserer på at arbejde med netop dette dataformat.

    I dette tilfælde bruges JSON-formatet. Dette kan være sandt, men spørgsmålet er ikke fænomenaliteten af ​​sociale netværk, men det faktum, at præsentation af information i formatet "navn = værdi" er virkelig praktisk både til programmering og brug. I modsætning til det strenge og komplekse "XML" er dette virkelig et menneskevenligt format.

    Associative Arrays

    Det sker, at variabler skal beskrives (JavaScript), eller i det mindste skal en begyndelsesværdi angives (PHP). I begge tilfælde kan variablen meget nemt ændre sin type. Sproget udfører denne konvertering automatisk, hvis det er nødvendigt.

    Men hvorfor skulle variablen ikke også skifte navn, dukke op under udførelsen af ​​algoritmen og forsvinde, når den ikke længere er nødvendig? Associative arrays løser dette problem, men når man så bruger sådanne relativt dynamiske variable, vil arraynavnet og de tilsvarende syntaktiske konstruktioner følge, hvor de bruges.

    Denne omstændighed er især udtalt i PHP, men du kan affinde dig med det, som faktisk med "$"-symbolet i variabelnavnet og "$this->"-kombinationen inde i objektet. Programmering i JavaScript og PHP på samme tid, først bliver man virkelig overrasket over, hvor forskelligt alt er, men så bliver alt så velkendt og naturligt...

    Associative Array -> JSON

    I dette eksempel oprettes et *.docx-dokument ved hjælp af PHPOffice/PHPWord-biblioteket, og aProperties-arrayet indeholder egenskaberne for dette dokument (forfatter, firma, titel, kategori, oprettelsesdato...).

    Det andet array indeholder data for siden:

    • orientering (landskab eller normal);
    • lodrette og vandrette dimensioner;
    • indrykninger (margener venstre, top, bund, højre);
    • sidehoveder og sidefødder.

    Dokumentet genereres på den server, hvor PHPOffice/PHPWord-biblioteket er installeret. Siden giver dig mulighed for at administrere værdierne af disse arrays ved hjælp af JavaScript. Resultatet i JSON-format returneres tilbage til serveren og bruges i PHP-algoritmer, i dets konstruktioner, det vil sige i arrays.

    Dynamiske variabler

    JSON-formatet løser problemet med dynamiske variable. Her kan du oprette, ændre og slette variabler uden unødvendigt syntaktisk rod. Det ser pænt ud og bruges i JavaScript.

    I dette eksempel henter funktionen GetOjInfo() værdiens navn og værdi fra et objekt. I første omgang har JSON-strengobjektet, der er tildelt til variablen ojInfo, tre elementer: Navn, alder og arbejde. Lidt senere tilføjes Status-variablen.

    Efter den første delete-operator mister ojInfo-linjen alderselementet, efter den anden sletning mister den arbejdselementet. Hvis vi antager, at denne streng er et udvalg af variabler, der har en bestemt betydning, så ved hjælp af JSON kan du faktisk oprette, ændre og slette ethvert sæt af dem uden for det operationelle felt (syntaks) til at beskrive og behandle JavaScript-sproget.

    JSON-formatet er ikke designet til denne mulighed, men det er muligt, praktisk og praktisk.

    JSON (JavaScript Object Notation) er et simpelt dataudvekslingsformat, der er nemt at læse og skrive af både mennesker og computere. Det er baseret på en delmængde af JavaScript-programmeringssproget, defineret i standarden ECMA-262 3rd Edition - December 1999. JSON er et tekstformat, der er fuldstændig uafhængigt af implementeringssproget, men det bruger konventioner, der er kendt for programmører af C-lignende sprog, såsom C, C++, C#, Java, JavaScript, Perl, Python og mange andre. Disse egenskaber gør JSON til et ideelt dataudvekslingssprog.

    JSON er baseret på to datastrukturer:

    • En samling af nøgle/værdi-par. På forskellige sprog er dette koncept implementeret som et objekt, post, struktur, ordbog, hash, navngiven liste eller associativ array.
    • En ordnet liste over værdier. På de fleste sprog er dette implementeret som array, vektor, liste eller sekvens.

    Disse er universelle datastrukturer. Næsten alle moderne programmeringssprog understøtter dem i en eller anden form. Det er logisk at antage, at et dataformat, uafhængigt af programmeringssproget, skal baseres på disse strukturer.

    I JSON-notation ser det sådan ud:

    Et objekt- et uordnet sæt nøgle/værdi-par. Et objekt begynder med ( en åbnende krøllet bøjle og slutter med en ) lukkende krøllet bøjle. Hvert navn efterfølges af: et kolon, nøgle/værdi-par adskilt af et komma.

    Array- en ordnet samling af værdier. Arrayet begynder med en [ åben firkantet parentes og slutter med ] en afsluttende firkantet parentes. Værdier er adskilt med komma.


    Betyder Måske linje i dobbelte anførselstegn, nummer, sand , falsk , null , objekt eller array. Disse strukturer kan indlejres.


    Linje er en samling af nul eller flere Unicode-tegn, omgivet af dobbelte anførselstegn, der bruger \ omvendt skråstreg som escape-tegn. Tegnet er repræsenteret som en streng på ét tegn. Lignende syntaks bruges i C og Java.


    Nummer Det er repræsenteret på samme måde som i C eller Java, bortset fra at kun decimaltalsystemet bruges.


    Mellemrum kan bruges mellem alle tokens.

    Bortset fra nogle kodningsdetaljer, beskriver ovenstående fuldstændigt sproget.