PHP - JSON Razčlanjivanje


Šta je JSON?

JSON je skraćenica od JavaScript Object Notation. JSON je standardni lagani format za razmjenu podataka koji se brzo i lako razčlanjuje i generiše. JSON je, kao i XML, tekstualni format koji je jednostavan za pisanje i lak za razumijevanje i za ljude i za računare, ali za razliku od XML-a, JSON-ove strukture podataka zauzimaju manju širinu pojasa od svojih XML verzija. JSON se temelji na dvije osnovne strukture:

  • Objekt (Object): Ovo je definisano kao kolekcija parova ključ/vrijednost (tj. key:value). Svaki objekt započinje lijevom vitičastom zagradom {i završava desnom vitičastom zagradom}. Više parova ključ/vrijednost odvojeno je zarezom ,.

  • Niz (Array): Ovo je definisano kao uređena lista vrijednosti. Niz započinje lijevom uglastom zagradom [i završava desnom uglastom zagradom]. Vrijednosti su odvojene zarezom ,.

U JSON-u su ključevi uvijek stringovi, dok vrijednost može biti string, broj, tačno (true) ili netačno (netačno), null ili čak objekt ili niz. Stringovi moraju biti zatvoreni u dvostruke navodnike " i mogu da sadrže izlazne znakove kao što su: \n, \t i \. JSON objekt može izgledati ovako:

{
    "knjiga": {
        "ime": "Harry Potter i Vatreni pehar",
        "autor": "J. K. Rowling",
        "godina": 2000,
        "žanr": "Fantasy Fiction",
        "bestseller": true
    }
}

Dok bi primjer JSON niza izgledao otprilike ovako:

{
    "voće": [
        "Jabuka",
        "Banana",
        "Jagoda",
        "Mango"
    ]
}


Razčlanjivanje JSON-a sa PHP-om

JSON strukture podataka vrlo su slične PHP nizovima. PHP ima ugrađene funkcije za kodiranje i dekodiranje JSON podataka. To su funkcije json_encode() i json_decode(). Obe funkcije rade samo s podacima stringa kodiranim u UTF-8.



Kodiranje JSON podataka u PHP

U PHP-u funkcija json_encode() koristi se za kodiranje vrijednosti u JSON format. Vrijednost koja se kodira može biti bilo koji PHP tip podataka, osim resursa, poput baze podataka ili rukovanja datoteke. Sljedeći primjer pokazuje kako kodirati PHP asocijativni niz u JSON objekt:

<?php
// Asocijativni niz
$marks = array("Miloš"=>29, "Stefan"=>18, "Maja"=>24, "Dejan"=>39);
 
echo json_encode($marks);
?>
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>JSON_Encode PHP asocijativni niz</title>
</head>
<body>

<?php
// Asocijativni niz
$marks = array("Miloš"=>29, "Stefan"=>18, "Maja"=>24, "Dejan"=>39);
 
echo json_encode($marks);
?>

</body>
</html>

Slično tome, PHP indeksirani niz možete kodirati u JSON niz, ovako:

<?php
// Indeksirani niz
$colors = array("Crvena", "Zelena", "Plava", "Narandžasta", "Žuta");
 
echo json_encode($colors);
?>
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>JSON_Encode PHP indeksirani niz</title>
</head>
<body>

<?php
// Indeksirani niz
$colors = array("Crvena", "Zelena", "Plava", "Narandžasta", "Žuta");
 
echo json_encode($colors);
?>

</body>
</html>

Takođe možete prisiliti funkciju json_encode() da vrati PHP indeksirani niz kao JSON objekt pomoću opcije JSON_FORCE_OBJECT, kao što je prikazano u sljedećem primjeru:

<?php
// Indeksirani niz
$colors = array("Crvena", "Zelena", "Plava", "Narandžasta", "Žuta");
 
echo json_encode($colors, JSON_FORCE_OBJECT);
?>

Kao što možete vidjeti u gornjim primjerima, ne-asocijativni niz može se kodirati kao niz ili objekt. Međutim, asocijativni niz uvijek se kodira kao objekt.



Dekodiranje JSON podataka u PHP-u

Dekodiranje JSON podataka jednostavno je kao i njihovo kodiranje. Možete koristiti PHP funkciju json_decode() da pretvorite JSON kodirani string u odgovarajući tip PHP podataka. Sljedeći primjer pokazuje kako dekodirati ili pretvoriti JSON objekt u PHP objekt.

<?php
// Spremite JSON podatke u PHP varijablu
$json = '{"Miloš":29,"Stefan":28,"Marko":32,"Marija":42}';
 
var_dump(json_decode($json));
?>
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Dekodiranje JSON objekta u PHP-u</title>
</head>
<body>

<?php
// Spremite JSON podatke u PHP varijablu
$json = '{"Miloš":29,"Stefan":28,"Marko":32,"Marija":42}';
 
var_dump(json_decode($json));
?>

</body>
</html>

Po difoltu funkcija json_decode() vraća objekt. Međutim, po želji možete navesti drugi parametar $assoc koji prihvata logičku vrijednost koja se kada se postavi kao istinska (true) JSON objekti dekodiraju u asocijativne nizove. Po difoltu je netačno (false). Evo primjera:

<?php
// Spremite JSON podatke u PHP varijablu
$json = '{"Miloš":29,"Stefan":28,"Marko":32,"Marija":42}';
 
var_dump(json_decode($json, true));
?>
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Dekodiranje JSON objekta u asocijativni niz u PHP-u</title>
</head>
<body>

<?php
// Store JSON data in a PHP variable
$json = '{"Miloš":29,"Stefan":28,"Marko":32,"Marija":42}';
 
var_dump(json_decode($json, true));
?>

</body>
</html>

Sada pogledajmo primjer koji će vam pokazati kako dekodirati JSON podatke i pristupiti pojedinačnim elementima JSON objekta ili niza u PHP-u.

<?php
// Dodijelite JSON kodirani niz PHP varijabli
$json = '{"Miloš":29,"Stefan":28,"Marko":32,"Marija":42}';
 
// Dekodirajte JSON podatke u PHP asocijativni niz
$arr = json_decode($json, true);
// Pristupite vrijednostima iz asocijativnog niza
echo $arr["Miloš"];  // Ispisuje: 29
echo $arr["Stefan"];  // Ispisuje: 28
echo $arr["Marko"];   // Ispisuje: 32
echo $arr["Marija"];  // Ispisuje: 42
 
// Dekodirajte JSON podatke u PHP objekt
$obj = json_decode($json);
// Pristupite vrijednostima iz vraćenog objekta
echo $obj->Miloš;   // Ispisuje: 29
echo $obj->Stefan;   // Ispisuje: 28
echo $obj->Marko;    // Ispisuje: 32
echo $obj->Marija;   // Ispisuje: 42
?>
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Pristupite vrijednosti JSON objekta u PHP-u</title>
</head>
<body>

<?php
// Dodijelite JSON kodirani niz PHP varijabli
$json = '{"Miloš":29,"Stefan":28,"Marko":32,"Marija":42}';
 
// Dekodirajte JSON podatke u PHP asocijativni niz
$arr = json_decode($json, true);
// Pristupite vrijednostima iz asocijativnog niza
echo $arr["Miloš"];  // Ispisuje: 29
echo $arr["Stefan"];  // Ispisuje: 28
echo $arr["Marko"];   // Ispisuje: 32
echo $arr["Marija"];  // Ispisuje: 42

echo "<hr>"; 

// Dekodirajte JSON podatke u PHP objekt
$obj = json_decode($json);
// Pristupite vrijednostima iz vraćenog objekta
echo $obj->Miloš;   // Ispisuje: 29
echo $obj->Stefan;   // Ispisuje: 28
echo $obj->Marko;    // Ispisuje: 32
echo $obj->Marija;   // Ispisuje: 42
?>

</body>
</html>

Takođe možete provući dekodirane podatke pomoću foreach() petlje, kao što je prikazano u idućem primjeru:

<?php
// Dodijelite JSON kodirani niz PHP varijabli
$json = '{"Miloš":29,"Stefan":28,"Marko":32,"Marija":42}';
 
// Dekodirajte JSON podatke u PHP asocijativni niz
$arr = json_decode($json, true);
 
// Prođite kroz asocijativni niz
foreach($arr as $key=>$value){
    echo $key . "=>" . $value . "<br>";
}
echo "<hr>";

// Dekodirajte JSON podatke u PHP objekt
$obj = json_decode($json);
 
// Prelistajte objekt
foreach($obj as $key=>$value){
    echo $key . "=>" . $value . "<br>";
}
?>


Izdvajanje vrijednosti iz ugniježdenih JSON podataka u PHP-u

JSON objekti i nizovi se takođe mogu ugnijezditi. JSON objekt može proizvoljno da sadrži druge JSON objekte, nizove, ugniježđene nizove, nizove JSON objekata itd. Sljedeći primjer će vam pokazati kako dekodirati ugniježdeni JSON objekt i ispisati sve njegove vrijednosti u PHP-u.

<?php
// Definišite rekurzivnu funkciju za izdvajanje ugniježdenih vrijednosti
function printValues($arr) {
    global $count;
    global $values;
    
    // Ulaz za provjeru je niz
    if(!is_array($arr)){
        die("ERROR: Ulaz nije niz");
    }
    
    /*
    Prelistajte niz, ako je vrijednost rekurzivni niz, pozovite
    funkcija else, dodaje vrijednost koja se nalazi u polju izlaznih stavki  i
    povećajte brojač za 1 za svaku pronađenu vrijednost
    */
    foreach($arr as $key=>$value){
        if(is_array($value)){
            printValues($value);
        } else{
            $values[] = $value;
            $count++;
        }
    }
    
    // Vrati ukupan broj i vrijednosti pronađen u polju
    return array('total' => $count, 'values' => $values);
}
 
// Dodijelite JSON kodirani niz PHP varijabli
$json = '{
    "knjiga": {
        "name": "Harry Potter i Vatreni pehar",
        "autor": "J. K. Rowling",
        "godina": 2000,
        "znakova": ["Harry Potter", "Hermione Granger", "Ron Weasley"],
        "zanr": "Fantasy Fiction",
        "cijena": {
            "broširan uvez": "$10.40", "tvrdi uvez": "$20.32", "samo papir": "4.11"
        }
    }
}';
// Dekodirajte JSON podatke u PHP format asocijativnog niza
$arr = json_decode($json, true);
 
// Pozovite funkciju i ispišite sve vrijednosti
$result = printValues($arr);
echo "<h3>" . $result["total"] . " artikala(s) pronađeno: </h3>";
echo implode("<br>", $result["values"]);
 
echo "<hr>";
 
// Ispišite jednu vrijednost
echo $arr["knjiga"]["autor"] . "<br>";  // Ispisuje: J. K. Rowling
echo $arr["knjiga"]["znakova"][0] . "<br>";  // Ispisuje: Harry Potter
echo $arr["knjiga"]["cijena"]["tvrdi uvez"];  // Ispisuje: $20.32
?>