Json firkantede parenteser. Introduksjon til JSON

I denne artikkelen vil jeg snakke om tekstdatautvekslingsformatet - JSON, og spesifikt om å jobbe med dette formatet i PHP.

JSON er et kompakt tekstdataformat. Den kan brukes både i Internett-dataoverføringstjenester og for å lagre informasjon i en strukturert form.

JSON( engelsk JavaScript-objektnotasjon) er et tekstbasert datautvekslingsformat basert på JavaScript og ofte brukt med dette språket. Som mange andre tekstformater er JSON lett å lese av mennesker.

Til tross for sin opprinnelse i JavaScript (mer presist, fra en undergruppe av språket i 1999 ECMA-262-standarden), anses formatet som språkuavhengig og kan brukes med nesten alle programmeringsspråk. For mange språk finnes det ferdig kode for å lage og behandle data i JSON-format.

De praktiske fordelene ved å bruke JSON avsløres når du bruker AJAX-teknologi. JSON-formatet er mer kortfattet og lesbart enn XML, og er innfødt til Javascript. I tillegg er det mulig å sette inn fullt funksjonelle funksjoner i JSON-kode.

Ja, det er i AJAX-teknologien, etter min mening, hovedapplikasjonen er. Siden AJAX-teknologi innebærer å sende en klientforespørsel til serveren. Deretter behandles forespørselen på serveren, og resultatet sendes som svar til klienten.

Type data i JSON-format

JSON støtter alle store dataformater: strenger, tall, booleaner, samt matriser og objekter (nøkkel:verdi-kombinasjoner atskilt med komma og omsluttet av krøllete klammeparenteser).

Her er et eksempel på datarepresentasjon i JSON-format:

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

La oss se på hva denne linjen kan formidle: en person med navnet "ivan", under identifikatoren "1", som bor i landet "Russland" jobber i selskapet "yandex" i "ledelse" -avdelingen.

La oss gi et annet eksempel. Nettstedet har et tilbakemeldingsskjema som bruker AJAX-teknologi. Den besøkende fyller ut informasjonen, deretter sendes den til serveren for verifisering hvis ingen feil blir funnet, informasjonen lagres i databasen og et svar sendes som indikerer vellykket lagring. Men hvis feil blir funnet, returneres et svar med feiltyper.

Eksempel på feilrespons i JSON-format:

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

Som for eksempel betyr:

  • Du må fylle ut «Kontaktperson»-feltet
  • Du må fylle ut "E-post"-feltet
  • Du må fylle ut "Telefon"-feltet
  • Skriv inn meldingstekst
  • Du må fylle ut "Nummer i bildet"-feltet

Hvis det ikke er noen feil, returneres svaret:

("feil":"0")

Noe som indikerer vellykket sending av data.

I PHP brukes JSON-utvidelsen til å representere data i JSON-format. I PHP-versjoner eldre enn 5.2.0 er JSON-støtte innebygd i kjernen i tidligere versjoner, du må inkludere en ekstra fil med funksjoner i skriptet ditt.

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

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

Nå vil $obj inneholde JSON-data oversatt til et PHP-objekt, som du får tilgang til som følger:

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

Som du kan se, er $obj->office en matrise.

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

Å jobbe med JSON lar deg utveksle data med serveren i "ren form". Det er ikke nødvendig å sende store biter av HTML-kode.

Du har sikkert noen gang hørt om JSON. Hva er dette? Hva kan det gjøre og hvordan bruker det?

I denne opplæringen vil vi dekke det grunnleggende om JSON og dekke følgende punkter:

  • Hva er JSON?
  • Hva brukes JSON til?
  • Hvordan lage en JSON-streng?
  • Et enkelt eksempel på en JSON-streng.
  • La oss sammenligne JSON og XML.
  • Hvordan jobbe med JSON i JavaScript og PHP?
Hva er JSON?

JSON er en enkel, tekstbasert måte å lagre og overføre strukturerte data på. Med en enkel syntaks kan du enkelt lagre alt fra et enkelt tall til strenger, matriser og objekter i ren tekst. Du kan også koble arrays og objekter sammen for å lage komplekse datastrukturer.

Når JSON-strengen er opprettet, er det enkelt å sende den til et annet program eller til et annet sted på nettverket fordi det er ren tekst.

JSON har følgende fordeler:

  • Den er kompakt.
  • Setningene er enkle å lese og komponere av både mennesker og datamaskiner.
  • Det kan enkelt konverteres til en datastruktur for de fleste programmeringsspråk (tall, strenger, booleaner, arrays, etc.)
  • Mange programmeringsspråk har funksjoner og biblioteker for å lese og lage JSON-strukturer.

Navnet JSON står for JavaScript Object Notation. Som navnet antyder, er det basert på en måte å definere objekter på (omtrent som å lage assosiative arrays på andre språk) og arrays.

Hva brukes JSON til?

Den vanligste bruken av JSON er å sende data fra serveren til nettleseren. Vanligvis leveres JSON-data ved hjelp av AJAX, som lar nettleseren og serveren kommunisere uten å måtte laste inn siden på nytt.

  • Brukeren klikker på et produktminiatyrbilde i en nettbutikk.
  • JavaScript som kjører på nettleseren genererer en AJAX-forespørsel til PHP-skriptet som kjører på serveren, og sender inn IDen til det valgte produktet.
  • PHP-skriptet henter produktnavn, beskrivelse, pris og annen informasjon fra databasen. Deretter komponerer den en JSON-streng fra dataene og sender den til nettleseren.
  • JavaScript som kjører på nettleseren mottar JSON-strengen, dekoder den og viser produktinformasjonen på siden for brukeren.
  • Du kan også bruke JSON til å sende data fra nettleseren til serveren ved å sende en JSON-streng som en parameter til GET- eller POST-forespørsler. Men denne metoden er mindre vanlig, siden dataoverføring gjennom AJAX-forespørsler kan forenkles. For eksempel kan produkt-ID-en inkluderes i URL-en som en del av en GET-forespørsel.

    jQuery-biblioteket har flere metoder, for eksempel getJSON() og parseJSON(), som gjør det enkelt å hente data ved hjelp av JSON gjennom AJAX-forespørsler.

    Hvordan lage en JSON-streng?

    Det er noen grunnleggende regler for å lage en JSON-streng:

    • JSON-strengen inneholder enten en matrise med verdier eller et objekt (en assosiativ matrise av navn/verdi-par).
    • Array er omsluttet av hakeparenteser ([ og ]) og inneholder en kommadelt liste med verdier.
    • Gjenstand er omsluttet av krøllete klammeparenteser (( og )) og inneholder en kommadelt liste over navn/verdi-par.
    • navn/verdipar består av feltnavnet omsluttet av doble anførselstegn, etterfulgt av et kolon (:) og feltverdien.
    • Betydning i en matrise eller et objekt kan det være:
      • Tall (heltall eller flyttall)
      • String (i doble anførselstegn)
      • Boolsk verdi (sann eller usann)
      • En annen matrise (omsluttet av firkantede parenteser)
      • En annen gjenstand (omsluttet av krøllete seler)
      • null verdi

    For å inkludere doble anførselstegn i en streng, må du bruke en omvendt skråstrek: \" . Som med mange programmeringsspråk kan du sette kontrolltegn og heksadesimale koder i en streng ved å sette en omvendt skråstrek foran dem. Se JSON-nettstedet for detaljer.

    Enkelt eksempel på JSON-streng

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

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

    La oss se på linjen i detalj:

    • Vi lager et objekt ved hjelp av krøllete klammeparenteser (( og )).
    • Objektet har flere navn/verdi-par: "orderID": 12345 En egenskap med navnet "orderId" og en heltallsverdi 12345 "shopperName": "Vanya Ivanov" en egenskap med navnet "shopperName" og strengverdien "Vanya Ivanov" " "shopperEmail": " [e-postbeskyttet]" En egenskap kalt "shopperEmail" med en strengverdi " [e-postbeskyttet]" "contents": [ ... ] En egenskap kalt "contents" hvis verdi er en matrise "orderCompleted": true En egenskap kalt "orderCompleted" og den boolske verdien true
    • Det er 2 objekter i "innhold"-matrisen som representerer individuelle elementer i rekkefølgen. Hvert objekt inneholder 3 egenskaper: produkt-ID , produktnavn og kvantitet .

    Forresten, siden JSON er basert på å deklarere JavaScript-objekter, kan du raskt og enkelt gjøre JSON-strengen ovenfor til et JavaScript-objekt:

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

    Sammenligning av JSON og XML

    På mange måter kan du tenke på JSON som et alternativ til XML, i det minste i webapplikasjonsområdet. Konseptet med AJAX var opprinnelig basert på bruk av XML for å overføre data mellom serveren og nettleseren. Men de siste årene har JSON blitt stadig mer populært for transport av AJAX-data.

    Mens XML er en velprøvd teknologi som brukes i et stort antall applikasjoner, har JSON fordelen av å være et mer kompakt og lettere gjenkjennelig dataformat.

    Dette er hvordan eksempelobjektet ovenfor i XML vil se ut:

    ordreID 12345 shopperName Vanya Ivanov shopperE-post [e-postbeskyttet] innhold produktID 34 produktnavn Superproduktantall 1 produktID 56 produktnavn Mirakelproduktantall 3 ordreFullført sant

    XML-versjonen er betydelig større. I virkeligheten er den 1128 tegn lang, mens JSON-versjonen bare er 323 tegn lang. XML-versjonen er også ganske vanskelig å forstå.

    Selvfølgelig er dette et radikalt eksempel. Og det er mulig å lage en mer kompakt XML-post. Men selv den vil være betydelig lengre enn JSON-ekvivalenten.

    Arbeide med en JSON-streng i JavaScript

    JSON har et enkelt format, men å lage en JSON-streng manuelt er ganske kjedelig. I tillegg må du ofte ta en JSON-streng, konvertere innholdet til en variabel som kan brukes i kode.

    De fleste programmeringsspråk har verktøy for enkelt å konvertere variabler til JSON-strenger og omvendt.

    Opprette en JSON-streng fra en variabel

    JavaScript har en innebygd JSON.stringify()-metode som tar en variabel og returnerer en JSON-streng som representerer innholdet. La oss for eksempel lage et JavaScript-objekt som inneholder ordreinformasjonen fra eksempelet vårt, og deretter lage en JSON-streng fra det:

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

    Denne koden vil produsere:

    Merk at JSON.stringify()-metoden returnerer en JSON-streng uten mellomrom. Den er vanskeligere å lese, men den er mer kompakt for overføring over nettverket.

    Det er flere måter å analysere en JSON-streng i JavaScript, men den sikreste og mest pålitelige er å bruke den innebygde JSON.parse()-metoden. Den mottar en JSON-streng og returnerer et JavaScript-objekt eller en matrise som inneholder dataene. For eksempel:

    var jsonString = " \ ( \ "orderID": 12345, \ "shopperName": "Vanya Ivanov", \ "shopperEmail": " [e-postbeskyttet]", \ "contents": [ \ ( \ "productID": 34, \ "productName": "Superprodukt", \ "quantity": 1 \), \ ( \ "productID": 56, \ "productName": "Mirakelvarer", \ "antall": 3 \ ) \ ], \ "bestilling Fullført": sant \ ) \ "; var cart = JSON.parse(jsonString); alert(cart.shopperEmail); alert(cart.contents.productName);

    Vi opprettet en jsonString-variabel som inneholder JSON-strengen i eksempelrekkefølgen vår. Vi sender deretter denne strengen til JSON.parse()-metoden, som lager et objekt som inneholder JSON-dataene og lagrer det i handlekurvvariabelen. Alt som gjenstår er å sjekke ved å vise egenskapene til shopperEmail-objektet og produktnavnet til innholdsmatrisen.

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

    I en ekte applikasjon vil JavaScript-koden motta ordren som en JSON-streng i et AJAX-svar fra serverskriptet, sende strengen til JSON.parse()-metoden og deretter bruke dataene til å vise den på brukerens side.

    JSON.stringify() og JSON.parse() har andre muligheter, for eksempel å bruke tilbakeringingsfunksjoner for å tilpasse bestemte data. Slike alternativer er svært nyttige for å konvertere forskjellige data til riktige JavaScript-objekter.

    Arbeide med en JSON-streng i PHP

    PHP, som JavaScript, har innebygde funksjoner for arbeid med JSON-strenger.

    Opprette en JSON-streng fra en PHP-variabel

    Funksjonen json_encode() tar en PHP-variabel og returnerer en JSON-streng som representerer innholdet i variabelen. Her er vårt bestillingseksempel, skrevet i PHP:

    Denne koden returnerer nøyaktig samme JSON-streng som i JavaScript-eksemplet:

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

    I en ekte applikasjon vil PHP-skriptet ditt sende denne JSON-strengen som en del av et AJAX-svar til nettleseren, der JavaScript-koden, ved å bruke JSON.parse()-metoden, vil analysere den tilbake til en variabel for visning på brukerens side .

    Du kan sende forskjellige flagg som det andre argumentet til json_encode()-funksjonen. Med deres hjelp kan du endre prinsippene for koding av innholdet i variabler til en JSON-streng.

    Lag en variabel fra en JSON-streng

    For å konvertere en JSON-streng til en PHP-variabel, bruk json_decode()-metoden. La oss erstatte vårt eksempel for JavaScript med JSON.parse()-metoden med PHP-kode:

    Som med JavaScript, vil denne koden produsere:

    [e-postbeskyttet] Mirakel produkt

    Som standard returnerer json_decode()-funksjonen JSON-objekter som PHP-objekter. Det er generiske PHP-objekter av stdClass-klassen. Det er derfor vi bruker -> for å få tilgang til objektets egenskaper i eksemplet ovenfor.

    Hvis du trenger et JSON-objekt som en tilknyttet PHP-matrise, må du sende true som det andre argumentet til json_decode()-funksjonen. For eksempel:

    $cart = json_decode($jsonString, true); echo $cart["shopperEmail"] . "
    "; echo $cart["contents"]["productName"] . "
    ";

    Denne koden vil produsere samme utdata:

    [e-postbeskyttet] Mirakel produkt

    Du kan også sende andre argumenter til json_decode()-funksjonen for å spesifisere rekursjonsdybden og hvordan man håndterer store heltall.

    Konklusjon

    Selv om JSON er lett å forstå og bruke, er det et veldig nyttig og fleksibelt verktøy for å overføre data mellom applikasjoner og datamaskiner, spesielt når du bruker AJAX. Hvis du planlegger å utvikle en AJAX-applikasjon, er det ingen tvil om at JSON vil bli et viktig verktøy i verkstedet ditt.

    ), og mellom serverne selv (HTTP-programvaregrensesnitt). JSON-formatet er også godt egnet for lagring av komplekse dynamiske strukturer i relasjonsdatabaser eller filbuffere.

    Siden JSON er et undersett av JavaScript-syntaks, kan det raskt deserialiseres ved hjelp av den innebygde eval()-funksjonen. I tillegg er det mulig å sette inn fullt funksjonelle JavaScript-funksjoner. I PHP, fra og med versjon 5.2.0, er JSON-støtte inkludert i kjernen i form av funksjonene json_decode() og json_encode(), som selv konverterer JSON-datatyper til tilsvarende PHP-typer og omvendt.

    Syntaks

    JSON er bygget på to strukturer:

    • Et sett med nøkkel/verdi-par. På forskjellige språk er dette implementert som gjenstand, post , struktur , ordbok , hashtabell , nøkkelliste eller assosiativ matrise . Nøkkelen kan bare være en streng, verdien kan bare være hvilken som helst form.
    • Et nummerert sett med verdier. På mange språk er dette implementert som array, vektor, liste eller sekvens.

    Dette er universelle datastrukturer. I teorien støtter alle moderne programmeringsspråk dem i en eller annen form. Siden JSON brukes til å utveksle data mellom forskjellige programmeringsspråk, er det fornuftig å bygge det på disse strukturene.

    Følgende skjemaer brukes i JSON:

    • Et objekt er et uordnet sett med navn/verdi-par omsluttet av krøllete klammeparenteser ( ). Det er et symbol mellom navnet og verdien ": " , og navn/verdi-par er atskilt med komma.
    • En matrise (endimensjonal) er et sett med verdier som har serienummer (indekser). Matrisen er omsluttet av firkantede parenteser. Verdier er atskilt med komma.
    • Verdien kan være linje i doble anførselstegn, tall, verdi ekte eller falsk, gjenstand, array, eller verdi null. Disse strukturene kan være nestet i hverandre.
    • En streng er et ordnet sett med null eller flere Unicode-tegn, omsluttet av doble anførselstegn, ved bruk av escape-sekvenser med omvendt skråstrek. Tegnene er representert som en enkel streng.
    • Navnet er en streng.

    Linje veldig lik en streng i språkene og Java. Tall også veldig likt et C- eller Java-tall, bortsett fra at kun desimalformat brukes. Mellomrom kan settes inn mellom to tegn.

    Følgende eksempel viser en JSON-representasjon av et objekt som beskriver en person. Objektet har streng for- og etternavnsfelt, et objekt som beskriver adressen, og en matrise som inneholder 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 vil en slik struktur se omtrent slik ut:

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

    812 123-1234 916 123-4567

    Sammenligning med YAML

    Både funksjonelt og syntaktisk er JSON en undergruppe av YAML-språket. Spesifikt sier YAML 1.2-spesifikasjonen at "enhver JSON-fil er en gyldig YAML-fil." Den vanligste YAML-parseren kan også behandle JSON. YAML-spesifikasjonen før versjon 1.2 dekket ikke JSON fullt ut, først og fremst på grunn av mangelen på innebygd støtte for UTF-32 i YAML, samt kravet om et mellomrom etter kommaskilletegnet. I tillegg inkluderte JSON-spesifikasjonen /* */ stilkommentarer.

    Den viktigste forskjellen i YAML er settet med syntaksutvidelser som ikke har noen analoger i JSON:

    Relasjonell: YAML støtter relasjonsdata: i et YAML-dokument kan du referere til et anker som oppstod tidligere i en fil/strøm. Rekursive strukturer kan uttrykkes på denne måten.

    Utvidbar: YAML støtter utvidbare datatyper utover primitiver (dvs. strenger, tall, booleaner).

    JSON Schema er et av språkene for å beskrive strukturen til et JSON-dokument. Bruker JSON-syntaks. Basert på konseptene XML Schema, RelaxNG, Kwalify. JSON Schema er et selvbeskrivende språk: når det brukes, kan de samme serialiserings-/deserialiseringsverktøyene brukes til å behandle data og beskrive deres gyldighet.

    Bruker JSON i Ajax

    Følgende eksempel på Javascript-kode viser hvordan en nettleser kan bruke XMLHttpRequest til å be om et JSON-formatert objekt fra serveren (serversiden av programmet er utelatt; den må inneholde koden som sender dataene som en JSON-streng som svar på forespørsler fra url).

    Var det_objektet;

    var http_request = new XMLHttpRequest() ;

    http_request.open("GET", url, true);

    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( "Det var et problem med URL-en." ) ; ) http_request = null ; ) ) ;

    Merk at dette eksempelet på bruk av XMLHttpRequest ikke er universelt for alle nettlesere (for nettlesere basert på Internet Explorer, Opera, Safari og Mozilla bør det være noen forskjeller i koden). Bruken av XMLHttpRequest er begrenset på grunn av samme opprinnelsespolicy: URL-en til svaret på forespørselen må være i samme DNS-domene som serveren der siden som ber om svaret er plassert. Et alternativ er JSONP-tilnærmingen, som innebærer å bruke et kodet funksjonskall som sendes mellom klienten og serveren slik at klienten kan laste inn JSON-kodede data fra tredjeparts domener, og varsle innringeren om fullføring, selv om dette introduserer noen sikkerhetsrisikoer og ekstra serverkrav.

    Selv om JSON er designet for å overføre data i en serialisert form, følger syntaksen JavaScript-syntaksen, og dette skaper en rekke sikkerhetsproblemer. Ofte, for å behandle data mottatt fra en ekstern kilde i JSON-format, brukes eval()-funksjonen på den uten noen foreløpig validering.

    JavaScript eval()

    Fordi JSON ser ut til å være en syntaktisk korrekt del av JavaScript-kode, er den enkleste måten å analysere JSON-data i et JavaScript-program på å bruke den innebygde JavaScript eval()-funksjonen, som er designet for å utføre JavaScript-uttrykk. Med denne tilnærmingen er det ikke nødvendig å bruke flere parsere.

    Teknikken eval() gjør systemet sårbart hvis kilden til JSON-dataene som brukes ikke er klarert ( engelsk). Slike data kan være skadelig JavaScript-kode for kodeinjeksjonsangrep ( engelsk). Ved å bruke denne sårbarheten er det mulig å stjele data og forfalske autentisering. Imidlertid kan sårbarheten elimineres ved å bruke ytterligere datavalideringsverktøy. For eksempel, før du kjører eval(), kan data mottatt fra en ekstern kilde valideres ved hjelp av regulære uttrykk. RFC-en som definerer JSON foreslår å bruke følgende kode for å sjekke om den samsvarer med JSON-formatet

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

    Som et sikrere alternativ til eval(), er det foreslått en ny funksjon, parseJSON(), som kun kan behandle JSON-data. Den ble introdusert i versjon 4 av ECMAScript-standarden og er beskrevet i artikkelen "JSON: A Low-Fat Alternative to XML". Det er for øyeblikket tilgjengelig som et JavaScript-bibliotek og vil bli inkludert i den femte utgaven av ECMAScript.

    Innebygd JSON

    Nyere versjoner av nettlesere har innebygd støtte for JSON og er i stand til å behandle den uten å kalle opp eval()-funksjonen, noe som fører til det beskrevne problemet. JSON-behandling er vanligvis raskere i dette tilfellet. Så i juni 2009 hadde følgende nettlesere innebygd JSON-støtte:

    Minst fem populære JavaScript-biblioteker bruker inline JSON når det er tilgjengelig:

    Forfalskning av forespørsel på tvers av domener

    Dårlig bruk av JSON gjør nettsteder sårbare for forfalskning av forespørsler på tvers av nettsteder (CSRF eller XSRF). Fordi taggen tillater bruk av en kilde som ikke tilhører samme domene som ressursen som bruker den, tillater den å kjøre kode som JSON-data i sammenheng med en vilkårlig side, noe som gjør det mulig å kompromittere passord eller annen sensitiv informasjon av brukere som er autentisert på et annet nettsted.

    Dette ser bare ut til å være et problem hvis JSON-dataene inneholder sensitiv informasjon som kan bli kompromittert av en tredjepart og hvis serveren er avhengig av en enkeltopprinnelsespolicy ( engelsk), blokkerer tilgang til data når en ekstern forespørsel oppdages. Dette er ikke et problem hvis serveren bestemmer gyldigheten av forespørselen, og gir kun data hvis de er riktige. HTTP-informasjonskapsler kan ikke brukes til å fastslå dette. Den eksklusive bruken av HTTP-informasjonskapsler brukes av forfalskning av forespørsler på tvers av nettsteder.

    JSONP og JSONPP

    JSONP (JSON Padding) eller "JSON with padding" er en utvidelse av JSON når navnet på en tilbakeringingsfunksjon er spesifisert som et input-argument.

    Teknologien er basert på at nettleserens sikkerhetspolicy tillater bruk av taggen for å få tilgang til andre servere enn serveren siden ble lastet fra.

    Uten å bruke JSONP-teknologi (det vil si å bruke bare JSON-datakoding), kan serveren bare returnere data. For eksempel slik:

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

    Dette er imidlertid kun data og kan ikke påvirke nettleseren.

    Ved å bruke JSONP-teknikken sendes navnet på tilbakeringingsfunksjonen til tredjepartsserveren i anropslinjen (GET):

    Her inneholder jsonp-parameteren navnet på tilbakeringingsfunksjonen parseResponse.

    Nå kan den utenlandske serveren example.com returnere følgende kode:

    ParseResponse(( "papir" : "A4" , "telling" : 5 ) )

    Koden kaller nå det første domenets javascript-funksjon.

    Ideen ble opprinnelig foreslått på MacPython-bloggen i 2005, og brukes for tiden av mange Web 2.0-applikasjoner som Dojo Toolkit-applikasjoner, Google Toolkit-applikasjoner og zanox Web Services. Ytterligere utvidelser til denne protokollen har blitt foreslått for å inkludere ytterligere argumenter, for eksempel JSONPPs støtte for S3DB-webtjenester.

    Fordi JSONP bruker skriptkoder, er samtaler i hovedsak åpne for verden. Av denne grunn kan JSONP være uegnet for lagring av sensitive data.

    Aktivering av skriptkoder fra eksterne nettsteder lar dem overføre alt innhold på nettstedet. Hvis det eksterne nettstedet har sårbarheter som tillater Javascript-injeksjon, kan det opprinnelige nettstedet også bli påvirket av dem.

    JSONPP (parameterisert JSON med polstring) Parameterisert JSON med polstring - utvikling av JSONP-ideen

    JSONPP inkluderer kilde-URLen, navnet på funksjonen som skal behandle JSON-dataene, en linje for eval etter mottak av dataene og en linje for eval etter endt behandling av dataene:

    JSON_call(SRC, JSONP, JSONPP, ONLOAD) ;

    snur seg til slutt

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

    Generelt er ikke antall parametere viktig for selve JSONPP-ideen. SRC, JSONP, JSONPP (og deres behandling på serversiden og deretter på klientsiden) er nok til at det er JSONPP.

    La oss se på eksempelet på å jobbe med S3DB-tjenesten.

    Funksjon 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 = kall script.type = "text/javascript" ; &onload=remove_element_by_id("" + script.id + "")" ; script.src = src; headID.appendChild (script) ; // hente svar ) funksjon s3db_jsonpp(ans, jsonpp) ( eval(jsonpp); return ans ; ) funksjon remove_element_by_id(id) ( var e = document.getElementById (id) ; e.parentNode .removeChild (e) ; return false ; )

    I eksemplet oppretter s3db_jsonpp_call()-funksjonen et skriptelement i DOM i hodedelen, hvis src tilsvarer JSONPP-kallet.

    Etter å ha mottatt et svar fra serveren vil s3db_jsonpp() bli kalt - det sendes i kalleparameterne, slik det skal være i henhold til JSONP-reglene.

    Inne i s3db_jsonpp() vil eval(jsonpp) utløses og returnere verdien ans.

    Å kalle eval(onload) fører til kjøring av remove_element_by_id() med ID-en til det opprettede skriptet i hodet og til slutt til sletting, fordi det uansett ikke vil bli brukt siden ID-en i eksemplet ble generert tilfeldig helt i begynnelsen av s3db_jsonpp_call()-funksjonen. Dette kallet er i serversvaret.

    Objektreferanser

    JSON-standarden støtter ikke objektreferanser, men Dojo Toolkit viser hvordan standard JSON kan støtte slike referanser ved hjelp av tilleggskonvensjoner. Spesielt gir dojox.json.ref-modulen støtte for flere former for lenker, inkludert sirkulære, multiple, inter-dokument og late lenker.

    Se også merknader
  • YAML Ain't Markup Language (YAML™) versjon 1.2 (engelsk) . - Arbeidsutkast 2008-05-11.(utilgjengelig lenke - historie) Hentet 24. september 2009.
  • . RedHanded (07. april 2005). Hentet 25. september 2012. .
  • Json.Com JSON-skjemaforslag (utilgjengelig lenke - historie)
  • RFC 4627
  • JSON: Det fettfrie alternativet til XML. Arkivert
  • json2.js (engelsk) . Arkivert fra originalen 12. februar 2012. Hentet 24. september 2009.
  • Bruker innebygd JSON.
  • Innebygd JSON i IE8. Arkivert fra originalen 12. februar 2012.
  • Nettspesifikasjoner støttes i Opera Presto 2.5 (engelsk) (10. mars 2010). Arkivert fra originalen 12. februar 2012. Hentet 29. mars 2010.
  • ES 3.1-implementering av JSON-objekt.
  • Billett #4429lang=no . Arkivert fra originalen 12. februar 2012.
  • Billett #4429 (22. mai 2009). Arkivert fra originalen 12. februar 2012. Hentet 3. juli 2009.
  • Billett #8111lang=no . Arkivert fra originalen 12. februar 2012.
  • MooTools Core & More 1.3.1. Arkivert fra originalen 12. februar 2012.
  • YUI 2: JSON-verktøy (1. september 2009). Arkivert fra originalen 12. februar 2012. Hentet 22. oktober 2009.
  • Lær JSON (7. april 2010). Arkivert fra originalen 12. februar 2012. Hentet 7. april 2010.
  • Jeremy Grossman Avanserte angrepsteknikker mot nettapplikasjoner som bruker Gmail. WhiteHat Sikkerhet. Arkivert fra originalen 12. februar 2012. Hentet 23. september 2009.
  • fra __future__ import * » Ekstern JSON - JSONP . Bob.pythonmac.org. Arkivert 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 for Cross Site XHR .(utilgjengelig lenke - historie)
  • JSON-referanser i Dojo. Arkivert fra originalen 12. februar 2012.
  • Linker
    • Offisiell hjemmeside i formatet på russisk
    • json.js, json2.js er et bibliotek utviklet av Douglas Crockford for å jobbe med JSON-data i JavaScript. Utvider et objekt med toJSONString-metoden, som deretter er til stede i ethvert objekt, og konverterer det til en JSON-formatstreng.
    • json-rpc.org (engelsk)
    DokumentmarkeringsspråkOffice-dokumenter

    Variabler, matriser og objekter er en kjent og praktisk form for datarepresentasjon. Det er vanlig å beskrive data i JavaScript-nettleserspråket, som ikke er nødvendig i PHP-serverspråket. JSON-formatet lar deg oppsummere dem i én helhet og ikke fokusere på programmeringsspråket. I dette tilfellet blir dataene til par: "navn = verdi". Verdien i hver av dem kan også være en samling av slike par.

    Det er vanlig å assosiere JSON med krøllete bukseseler og sistnevnte er ganske berettiget, siden JSON-formatet = JavaScript Object Notation. Mye har endret seg de siste spesielt dynamiske årene. Det som ble skapt for et bestemt formål ga ofte uventede resultater eller åpnet nye horisonter.

    Datautveksling: nettleser - server

    AJAX-teknologi har blitt tradisjonell, vanlig sideoppdatering fullstendig har sluttet å være populær. En besøkende, som åpner et nettsted, setter i gang en serie delvise datautvekslinger, når visse sider bare endres på det stedet som er relevant.

    Det antas at fremveksten av JSON er assosiert med bruken av AJAX, men faktisk har assosiativ og dens objektnotasjon (funksjoner i syntaksen for å beskrive og bruke objekter) et mye mer relatert forhold til JSON enn utveksling av data mellom nettleseren og serveren.

    Siden innholdet på sidene til moderne nettsteder virkelig har blitt "massivt" (voluminøst), har effektiviteten til formatet for datautveksling fått spesiell betydning. Dette er ikke å si at JSON har blitt en ny datarepresentasjon, men det faktum at det lenge har vært et element i JavaScript-syntaks er betydelig.

    Bruken av kyrillisk i navngiving av variabler er et veldig uventet fenomen (tull), men det fungerer i de nyeste versjonene av Chrome, Firefox og til og med Internet Explorer 11.

    Kyrillisk og JSON

    Selvfølgelig er det ingen vits i å bruke dette helt uventede fenomenet, og huske hvor lett verdiene til variabler skrevet med russiske bokstaver blir til vrøvl: hva kan vi si om navn, spesielt eksterne.

    Det er tvilsomt at initiativet i kyrilliske navn vil bli støttet av det eksterne miljøet til nettleseren, som det hele tiden må forholde seg til. Men dette faktum fortjener oppmerksomhet av den enkle grunn at JSON-formatet er muligheten til å skrive navn og verdier som utvikleren ønsker. Dette er viktig, siden beskrivelsen av applikasjonsområdet slik den krever det i hver oppgave forenkler feilsøkingen betydelig og reduserer antall feil.

    Det spiller ingen rolle hva nøyaktig grunnlaget for den syntaktiske innovasjonen - JSON - var, det er viktig at det ga den juridiske retten og den reelle muligheten til å sette korrespondansen: "ethvert navn = enhver verdi."

    Vi må hylle JavaScript-språket: det som leveres av syntaksen forplikter ikke utvikleren og pålegger ham ikke noe. Utvikleren bruker fritt språksyntaksen for optimalt å danne en datamodell og en algoritme for deres bruk.

    PHP og JSON

    Ved å akseptere data i JSON-format, gir serveren (via PHP, spesielt) muligheten til å behandle dem som de er og returnere resultatet tilbake til nettleseren i et lignende format. PHP-kildearray:

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

    Konverter til JSON for levering til nettleser:

    • $cJS = json_encode($cJSON).

    Resultat:

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

    Hekkingen vist på bildet er tillatt.

    Her ble den genererte matrisen lagt til med et nytt element "i seg selv" med den automatiske indeksen "0", og deretter igjen med den spesifiserte indeksen "z".

    Json_decode() konverterer en JSON-streng til en PHP-array. Lignende resultater kan oppnås ved å manipulere funksjoner og eksplodere(). I noen tilfeller er dette alternativet å foretrekke.

    Hekkenivå

    Elementer kan nestes både på nettlesersiden og på serversiden. I praksis gir JSON-formatet (RFC 4627 standardbeskrivelse) betydelig mer enn 4 nivåer av hekking, men denne funksjonen bør ikke misbrukes.

    Det er best å aldri gå utover rimelig nok dette gjør koden lesbar, noe som gjør det lettere å feilsøke og forstå for andre utviklere.

    JSON blir ofte referert til som datakonstruksjoner som er enklere enn XML og forståelige for både mennesker og datamaskiner. Dette gjelder når datamengden er liten og utvikleren har valgt hekkenivå med omhu. I alle andre tilfeller er det vanskelig å telle antall parenteser og forstå både på nettlesersiden og på serversiden.

    JSON-filer

    Bruken av JSON i praksis er ofte ikke begrenset til en merkbar kort streng. Enhver datakonstruksjon er alltid pragmatisk. Samtidig kan JSON effektivt brukes både i reelle oppgavedata (bedriftspersonale) og for implementering av midlertidige data (objektbuffer).

    Enterprise staff og JSON-format: eksempel

    Vanligvis er en post om én person et etternavn, fornavn, patronym, fødselsår, spesialitet, utdanning, ... og noen andre enkle verdier. Selv i spesielt krevende selskaper vil en rekord på én person ikke overstige et dusin eller to felt. Dette er merkbart og kan plasseres i en databasestreng.

    Hvis en bedrift sysselsetter flere er dette én ting, men er det titusener er dette en helt annen. Du kan fortsette å bruke databasen, men å lagre den som en fil virker mer praktisk og tilgjengelig å bruke.

    JSON er en ren tekstfil. Saken med bemanningsbordet sier seg selv. Du kan alltid lese den. Åpne og rediger er også tilgjengelig i alle tekstredigerere som ikke har for vane å legge til sin egen tjenesteinformasjon til innholdet i filen. Generelt er *.json ren tekst både inne i nettleseren og inne i filen - en streng.

    Bildet viser cachen til objektet som danner bildet, et eksempel.

    Dette er et eksempel på innholdet i en fil generert av et nettsted som tilbyr 3D-fargeutskriftstjenester på krus og keramiske produkter. Naturligvis, å ha et slikt JSON-format, er det veldig problematisk å bestemme hvordan det skal åpnes. Men i dette og lignende tilfeller er det ingen problemer med å lese filen: PHP leser filen, analyserer den og sender den til nettleseren. Dataene som er endret av den besøkende, returneres til serveren og skrives tilbake.

    I dette tilfellet fungerer filen som en variabel som lagres utenfor koden. Om nødvendig mottar variabelen en verdi fra filen, og hvis den endres av den besøkende i dialogen gitt av nettstedet, vil alle endringer bli registrert som de er. Det er ikke nødvendig å lese og kontrollere innholdet i filen.

    JSON brukes ofte til å lagre og bruke tjenesteinformasjon – dette er ikke en bemanningstabell, og verken utvikleren eller besøkende på nettstedet trenger å se den.

    XML og JSON

    "Det er en tid for alt" er en klassisk kunnskap akseptert som et aksiom allerede før programmeringens inntog. "Ingenting bare vises" - dette skjedde også før mennesket skrev det første forståelige programmet på et kunstig språk.

    Dataformater oppstår fra reelle behov og er basert på oppnådd kunnskap. HTML har sin egen bane, XML har sin egen bane, og JSON er JavaScript-objektlogikk utvidet til andre språk. Å sammenligne en med en annen er ikke den beste tingen å gjøre. Til hver sin egen.

    XML takler sine oppgaver fantastisk og kommer tydeligvis ikke til å bli historie. Og JSON ble brukt frem til 2006, det er bare at ikke alle utviklere anså det som sin plikt å erklære visse alternativer for å representere dataene deres.

    Det har vært tilfeller i praksis da programmer ble skrevet i BASIC som ikke brukte JSON som sådan, men perfekt lagret "navn = verdi"-par og gjorde dem tilgjengelige for de riktige algoritmene til rett tid.

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

    Vanen med å jobbe med assosiative arrays og objekter i JavaScript gjør bruken av JSON naturlig og praktisk. Dette er et virkelig flott format, men muligheten til å skille og bli med, manipulere strenger og matriser, har mye dypere røtter.

    Join/split-funksjonene til JavaScript-språket og implode/explode av PHP-språket lar deg enkelt og effektivt bruke både XML, JSON-dataformater og din egen versjon. Sistnevnte er ofte optimal, mens de to første er ideelle for generelle bruksmuligheter. Hvis informasjon overføres til en annen utvikler, server, fil eller database, er det ingen bedre måte å finne XML og JSON på. Alle jobber med dem, så overføring/mottak av informasjon krever ikke kommentarer.

    Bruker JSON i Android

    Å lese og skrive data i JSON-format i Android er ikke bare normen, men det er også mange objekter som fokuserer på å jobbe med dette bestemte dataformatet.

    I dette tilfellet brukes JSON-formatet. Dette kan være sant, men spørsmålet er ikke fenomenaliteten til sosiale nettverk, men det faktum at det å presentere informasjon i formatet "navn = verdi" er veldig praktisk både for programmering og bruk. I motsetning til det strenge og komplekse "XML", er dette virkelig et menneskevennlig format.

    Assosiative matriser

    Det hender at variabler må beskrives (JavaScript) eller i det minste en initialverdi må spesifiseres (PHP). I begge tilfeller kan variabelen endre type veldig enkelt. Språket utfører denne konverteringen automatisk om nødvendig.

    Men hvorfor skulle ikke variabelen også endre navn, vises under utførelse av algoritmen og forsvinne når den ikke lenger er nødvendig? Assosiative arrays løser dette problemet, men når man bruker slike relativt dynamiske variabler, vil arraynavnet og de tilsvarende syntaktiske konstruksjonene følge der de brukes.

    Denne omstendigheten er spesielt uttalt i PHP, men du kan tåle det, som faktisk med "$"-symbolet i variabelnavnet og "$this->"-kombinasjonen inne i objektet. Programmering i JavaScript og PHP samtidig, først blir du virkelig overrasket over hvor forskjellig alt er, men så blir alt så kjent og naturlig...

    Associative Array -> JSON

    I dette eksemplet opprettes et *.docx-dokument ved å bruke PHPOffice/PHPWord-biblioteket, og aProperties-arrayet inneholder egenskapene til dette dokumentet (forfatter, firma, tittel, kategori, opprettelsesdato...).

    Den andre matrisen inneholder data for siden:

    • orientering (landskap eller normal);
    • vertikale og horisontale dimensjoner;
    • innrykk (marger venstre, topp, bunn, høyre);
    • topp- og bunntekst.

    Dokumentet genereres på serveren der PHPOffice/PHPWord-biblioteket er installert. Nettstedet lar deg administrere verdiene til disse matrisene ved hjelp av JavaScript. Resultatet i JSON-format returneres tilbake til serveren og brukes i PHP-algoritmer, i dens konstruksjoner, det vil si i arrays.

    Dynamiske variabler

    JSON-formatet løser problemet med dynamiske variabler. Her kan du opprette, endre og slette variabler uten unødvendig syntaktisk rot. Det ser fint ut og brukes i JavaScript.

    I dette eksemplet henter funksjonen GetOjInfo() verdinavnet og verdien fra et objekt. I utgangspunktet har JSON-strengobjektet som er tilordnet ojInfo-variabelen tre elementer: Navn, alder og arbeid. Litt senere legges Status-variabelen til.

    Etter den første sletteoperatoren mister ojInfo-linjen alderselementet, etter den andre slettingen mister den arbeidselementet. Hvis vi antar at denne strengen er et utvalg av variabler som har en viss betydning, kan du ved å bruke JSON faktisk opprette, endre og slette alle sett av dem utenfor operasjonsfeltet (syntaks) for å beskrive og behandle JavaScript-språket.

    JSON-formatet ble ikke designet for dette alternativet, men det er mulig, praktisk og praktisk.

    JSON (JavaScript Object Notation) er et enkelt datautvekslingsformat som er enkelt å lese og skrive av både mennesker og datamaskiner.

    Det er basert på et undersett av JavaScript-programmeringsspråket, definert i ECMA-262 3rd Edition – desember 1999-standarden. JSON er et tekstformat som er helt uavhengig av implementeringsspråket, men det bruker konvensjoner som er kjent for programmerere av C-lignende språk som C, C++, C#, Java, JavaScript, Perl, Python og mange andre. Disse egenskapene gjør JSON til et ideelt datautvekslingsspråk.

    • JSON er basert på to datastrukturer: gjenstand En samling nøkkel/verdi-par. På forskjellige språk er dette konseptet implementert som
    • , post, struktur, ordbok, hash, navngitt liste eller assosiativ matrise. array En ordnet liste over verdier. På de fleste språk er dette implementert som

    , vektor, liste eller sekvens.

    Dette er universelle datastrukturer. Nesten alle moderne programmeringsspråk støtter dem i en eller annen form.

    Gjenstand Det er logisk å anta at et dataformat, uavhengig av programmeringsspråket, skal være basert på disse strukturene.

    Array I JSON-notasjon ser det slik ut:


    Betydning- et uordnet sett med nøkkel/verdi-par. Et objekt begynner med ( en åpnende krøllete klammeparentes og slutter med en ) lukkende krøllete klammeparentes. Hvert navn er etterfulgt av: et kolon, nøkkel/verdi-par atskilt med komma. linje i doble anførselstegn, tall- en ordnet samling av verdier. Matrisen begynner med en [ åpen hakeparentes og slutter med ] en avsluttende hakeparentes. gjenstand eller array Verdier er atskilt med komma.


    Linje Kan være


    Tall, sant , usant , null ,


    . Disse strukturene kan nestes.

    er en samling av null eller flere Unicode-tegn, omsluttet av doble anførselstegn, med \ omvendt skråstrek som escape-tegnet.