PHP Manual
/
Datastrukturer

Json i PHP - behandling, generering og formatering

26. 11. 2019

Obsah článku

Json-dataformatet blev skabt for at lette overførslen af strukturerede data mellem klient og server.

Konvertering af et array eller objekt til json

For at konvertere et array eller objekt til Json findes der en funktion json_encode i PHP:

$user = [
'navn' => 'Jan',
'efternavn' => 'Barasek',
'rolle' => [
'Admin',
'moderator',
],
];
echo json_encode($user);

Det vil generere:

{"name":"Jan","surname":"Barasek","role":["admin","moderator"]}

Funktionen json_encode() kan også konvertere andre datatyper. Vi kan f.eks. direkte indsætte integer (heltal), string (streng) osv.

Json pretty print - bedre læsbarhed for mennesker

I standardkonfigurationen genereres json som én lang streng. Dette er for at optage så lidt plads som muligt.

Hvis du har brug for bedre læsbarhed, skal du blot sende konstanten JSON_PRETTY_PRINT som den anden parameter:

echo json_encode($users, JSON_PRETTY_PRINT);

Det vil generere:

{
"navn": "Jan",
"efternavn": "Barasek",
"rolle": [
"Admin",
"moderator"
]
}

Formatering af json - brugerdefinerede formateringsregler

Den normale formatering af json via PHP har ingen yderligere indstillinger, og vi er nødt til at nøjes med dette output. Hvis vi f.eks. ønsker at indrykke tabulatorer i stedet for mellemrum (eller ændre genereringsreglerne på nogen måde), skal vi selv programmere det.

Denne funktion kan allerede lave grundlæggende formatering, og vi skal blot ændre den:

function prettyJsonPrint(string $json): string
{
$result = '';
$level = 0;
$in_quotes = false;
$in_escape = false;
$ends_line_level = NULL;
$json_length = strlen($json);
for ($i = 0; $i < $json_length; $i++) {
$char = $json[$i];
$new_line_level = NULL;
$post = '';
if ($ends_line_level !== NULL) {
$new_line_level = $ends_line_level;
$ends_line_level = NULL;
}
if ($in_escape) {
$in_escape = false;
} else if ($char === '"') {
$in_quotes = !$in_quotes;
} else if (!$in_quotes) {
switch ($char) {
case '}':
case ']':
$level--;
$ends_line_level = NULL;
$new_line_level = $level;
break;
case '{':
case '[':
$level++;
case ',':
$ends_line_level = $level;
break;
case ':':
$post = '';
break;
case "":
case "\t":
case "\n":
case "\r":
$char = '';
$ends_line_level = $new_line_level;
$new_line_level = NULL;
break;
}
} else if ($char === '\\') {
$in_escape = true;
}
if ($new_line_level !== NULL) {
$result .= "\n" . str_repeat("\t", $new_line_level);
}
$result .= $char . $post;
}
return $result;
}

Kilde : https://stackoverflow.com/questions/6054033/pretty…

For eksempel, input:

{"nøgle1":[1,2,3],"key2":"værdi"}

Formateret som:

{
"nøgle1": [
1,
2,
3
],
"key2": "værdi"
}

Hvilket er meget lettere at læse (på grund af den konsekvente indrykning af hvert element).

Farvelægning af json-notation som HTML

Nogle gange kan det være nyttigt at fremhæve taster, selve dataene og individuelle formateringselementer (især lukkende parenteser) med farve.

For eksempel, input:

{"adgang": {"symbolsk": {"issued_at": "2008-08-16T14:10:31.309353", "udløber": "2008-08-17T14:10:31Z", "id": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiOiAi"}, "serviceCatalog": [], "bruger": {"brugernavn": "ajay", "roller_links": [], "id": "16452ca89", "roller": [], "navn": "ajay"}}}

Formateret som:

{
  "access": {
    "token": {
      "issued_at""2008-08-16T14:10:31.309353"
      "udløber""2008-08-17T14:10:31Z"
"id""MIICQgYJKoZoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"
      },
    "serviceCatalog": [
    ], 
    "user": {
"brugernavn""ajay"
     "roles_links": [
       ], 
"16452ca89"
     "roller": [
       ], 
"name""ajay"
      }
  }
}

Dette kan gennemføres ved hjælp af følgende funktion:

function jsonColorFormater(string $json, string $indentation = "\t"): string
{
$crl = 0;
$ss = false;
$buffer = '';
for ($c = 0; $c < strlen($json); $c++) {
if ($json[$c] == '}' || $json[$c] == ']') {
$crl--;
$buffer .= "\n" . str_repeat($indentation, $crl);
}
if ($json[$c] == '"' && (@$json[$c - 1] == ',' || @$json[$c - 2] == ',')) {
$buffer .= "\n" . str_repeat($indentation, $crl);
}
if ($json[$c] == '"' && !$ss) {
$buffer .= '<span style="color:'.((@$json[$c - 1] == ':' || @$json[$c - 2] == ':') ? '#35D' : '#C22').';">';
}
$buffer .= $json[$c];
if ($json[$c] == '"' && $ss) $buffer .= '</span>';
if ($json[$c] == '"') $ss = !$ss;
if ($json[$c] == '{' || $json[$c] == '[') {
$crl++;
$buffer .= "\n". str_repeat($indentation, $crl);
}
}
// Returnerer HTML-kilde
return '<pre>' . $buffer . '</pre>';
}
// Kald bare dette og returnerer formateret output
// echo jsonColorFormater($data, ' ' ');

Funktion taget og radikalt omskrevet fra: https://stackoverflow.com/a/20953262/6777550

Konverter fra JSON til PHP array/objekt

Dette kan implementeres med funktionen json_decode(), som laver en datastruktur ud af Json, som vi skal arbejde med som et objekt:

$json = '{"name": "Jan", "efternavn": "Barasek", "role":["admin", "moderator"]}';
$decode = json_decode($json);
echo $decode->name; // Returnerer "Jan
// echo $decode->role;
//
// Dette er ikke muligt, fordi egenskabsrollen
// indeholder et array, vi skal iterere.
echo '<ul>';
foreach ($decode->role as $role) {
echo '<li>' . $role . '</li>'; // Lister fortløbende de roller, der ligger bag kuglerne
}
echo '</ul>';

Behandling i javascript

I jQuery-biblioteket kan en json-streng f.eks. meget let analyseres til et objekt:

var json = '{"name": "Jan", "efternavn": "Barasek", "role":["admin", "moderator"]}';
var parser = $.parseJSON(json);
document.write('Navn:' + parser.name);
console.log(parser); // Udskriver hele objektet til konsollen til fejlfinding

I javascript er json generelt et gyldigt javascript-objekt, som der kan arbejdes direkte med, og som man kan få adgang til dets egenskaber.

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024