ZAČÁTKYNÁVODYOOPDOKUMENTACE
Handledning/
Datastrukturer

Json i PHP - bearbetning, generering och formatering

26. 11. 2019

Obsah článku

Json-dataformatet skapades för att underlätta överföringen av strukturerade data mellan klient och server.

Konvertera en matris eller ett objekt till json

För att konvertera en array eller ett objekt till Json finns funktionen json_encode i PHP:

$user = [
'namn' => 'Jan',
'efternamn' => 'Barasek',
'roll' => [
'Admin',
'moderator',
],
];
echo json_encode($user);

Det kommer att generera:

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

Funktionen json_encode() kan också konvertera andra datatyper. Vi kan till exempel direkt infoga integer (heltal), string (sträng) och så vidare.

Json pretty print - bättre läsbarhet för människor

I standardkonfigurationen genereras json som en lång sträng. Detta för att ta upp så lite utrymme som möjligt.

Om du vill ha bättre läsbarhet kan du bara skicka konstanten JSON_PRETTY_PRINT som den andra parametern:

echo json_encode($users, JSON_PRETTY_PRINT);

Det kommer att generera:

{
"namn": "Jan",
"efternamn": "Barasek",
"roll": [
"Admin",
"moderator"
]
}

Formatering av json - anpassade formateringsregler

Den normala formateringen av json via PHP har inga ytterligare inställningar och vi måste nöja oss med denna utskrift. Om vi till exempel vill indela tabulaturer i stället för mellanslag (eller ändra genereringsreglerna på något sätt) måste vi programmera det själva.

Den här funktionen kan redan göra grundläggande formatering och vi behöver bara ändra 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;
}

Källa : https://stackoverflow.com/questions/6054033/pretty…

Till exempel:

{"nyckel1":[1,2,3],"key2":"värde"}

Formaterad som:

{
"nyckel1": [
1,
2,
3
],
"key2": "värde"
}

Det är mycket lättare att läsa (på grund av den konsekventa indragningen av varje element).

Färgläggning av json-notation som HTML

Ibland kan det vara användbart att färgmarkera tangenter, data och enskilda formateringselement (särskilt avslutande parenteser).

Till exempel:

{"tillgång till": {"symbol": {"issued_at": "2008-08-16T14:10:31.309353", "upphör att gälla": "2008-08-17T14:10:31Z", "id": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"}, "serviceCatalog": [], "användare": {"användarnamn": "ajay", "roller_länkar": [], "id": "16452ca89", "roller": [], "namn": "ajay"}}}

Formaterad som:

{
  "access": {
   "token": {
      "issued_at""2008-08-16T14:10:31.309353"
     "expires""2008-08-17T14:10:31Z"
"id""MIICQgYJJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"
      },
   "serviceCatalog": [
    ], 
   "user": {
"användarnamn""ajay"
     "roles_links": [
      ], 
"16452ca89"
     "roller": [
      ], 
"name""ajay"
     }
  }
}

Detta kan genomföras med hjälp av följande 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);
}
}
// Returnerar HTML-källan
return '<pre>' . $buffer . '</pre>';
}
// Kalla bara detta och återge formaterad utdata.
// echo jsonColorFormater($data, ' ');

Funktion hämtad och radikalt omskriven från: https://stackoverflow.com/a/20953262/6777550

Konvertera från JSON till PHP array/objekt

Detta kan genomföras med funktionen json_decode(), som skapar en datastruktur av Json som vi måste arbeta med som ett objekt:

$json = '{"namn": "Jan", "efternamn": "Barasek", "roll":["admin", "moderator"]}';
$decode = json_decode($json);
echo $decode->name; // Återger "Jan
// echo $decode->role;
//
// Detta är inte möjligt eftersom egenskapsrollen
// innehåller en matris, vi måste iterera.
echo '<ul>';
foreach ($decode->role as $role) {
echo '<li>' . $role . '</li>'; // Listan över de roller som ligger bakom punkterna är löpande.
}
echo '</ul>';

Bearbetning i javascript

I jQuery-biblioteket kan till exempel en json-sträng mycket enkelt analyseras till ett objekt:

var json = '{"namn": "Jan", "efternamn": "Barasek", "roll":["admin", "moderator"]}';
var parser = $.parseJSON(json);
document.write('Namn:' + parser.name);
console.log(parser); // Skriver ut hela objektet på konsolen för felsökning.

I javascript är json generellt sett ett giltigt javascriptobjekt som kan bearbetas direkt och vars egenskaper kan nås.

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.