如何在 PHP 中打印漂亮的 json?
How to log pretty printed json in PHP?
我正在 php 中构建一个 API。此 API 处理来自第三方 API 的 json 消息。
我想记录无效的精美打印 json 消息。
所以我这样做了:
error_log("test\n" . json_encode($json_string, JSON_PRETTY_PRINT));
但是,当我查看我的日志时,json 字符串打印得不太好:
$ tailf error.log
2015-07-13 10:20:03: (mod_fastcgi.c.2701) FastCGI-stderr: test
"{\"info\":{\"status\":200,\"msg\":\"OK\"},\"response\":{\"foo\":\"bar\"}"
我想看类似的东西:
$ tailf error.log
2015-07-13 10:20:03: (mod_fastcgi.c.2701) FastCGI-stderr: test
{
"info": {
"status": 200,
"msg ": "OK"
},
"response": {
"foo": "bar"
}
}
我怎样才能达到这个结果?
在这种情况下你有两个选择,
如果您可以使用 str_replace,例如:
error_log("test\n" . str_replace('\"',"\n",json_encode($json_string, JSON_PRETTY_PRINT)));
或者像@Karoly Horvath 说的那样:
您对一个已经在 JSON 中编码的字符串进行编码。您的 $json_string 已经编码。所以你需要解码你的第一个JSON并用好的参数重新编码它
error_log("test\n" . json_encode(json_decode($json_string), JSON_PRETTY_PRINT));
感谢@Karoly。
error_log("test\n" . json_encode($json_string, JSON_PRETTY_PRINT));
json_encode()
实际上不一定会产生JSON:它会产生一些可以被javascript读取的东西。如果你给它一个数组或一个对象,它会产生 JSON;如果你给它一个字符串,它会产生一个 javascript 字符串。这就是你正在做的,所以这就是你得到的。
明确地说,$json_string
是一个 字符串 :(就 PHP 而言,它是一个字符串;如果您传递相同的字符串javascript,它将被解释为一个对象)。你通过 json_encode()
传递它,你将得到的只是另一个字符串(双重编码的字符串 JSON)。
JSON_PRETTY_PRINT
在这里没有效果,因为你没有生成 JSON:你生成的东西 javascript 也会被视为字符串。
精明?
所以您需要做的是 (a) 将 $json_string
变回 PHP 数组,然后 (b) 将其重新编码为 JSON,这次使用JSON_PRETTY_PRINT
标志。
$log_array = json_decode($json_string, true);
$json_pretty_string = json_encode($log_array, JSON_PRETTY_PRINT);
error_log('test' . PHP_EOL . $json_pretty_string);
与其将其转换回 PHP 数组然后再转换回 JSON,不如将 JSON_PRETTY_PRINT
标志添加到您获得 [=13] 的任何位置=] 如果可能的话,从第一位开始。
或者,直接记录$json_string
(无需编码:它已经是一个字符串,你可以将它原样传递给error_log()
),并且只在你担心美化它时需要阅读 你的日志。这将使您的日志显着变小。
常见的 unix 错误日志不应包含人类可读的 json 或其他未转义的字符。许多 syslog/logging 实现受字符宽度限制并自动添加编码(如 \"
)或删除换行符,PHP 的 error_log 也不是二进制安全的 - 行为当遇到 unicode 字符时是不可预测的(不确定)。
您不应该使用本机 syslog/error 日志函数,相反,
构建您自己的记录器,专用于 json 日志记录。
我个人使用 MongoDB 来记录 json,因为它是 MongoDB 应该使用的数据类型。
我正在 php 中构建一个 API。此 API 处理来自第三方 API 的 json 消息。
我想记录无效的精美打印 json 消息。
所以我这样做了:
error_log("test\n" . json_encode($json_string, JSON_PRETTY_PRINT));
但是,当我查看我的日志时,json 字符串打印得不太好:
$ tailf error.log
2015-07-13 10:20:03: (mod_fastcgi.c.2701) FastCGI-stderr: test
"{\"info\":{\"status\":200,\"msg\":\"OK\"},\"response\":{\"foo\":\"bar\"}"
我想看类似的东西:
$ tailf error.log
2015-07-13 10:20:03: (mod_fastcgi.c.2701) FastCGI-stderr: test
{
"info": {
"status": 200,
"msg ": "OK"
},
"response": {
"foo": "bar"
}
}
我怎样才能达到这个结果?
在这种情况下你有两个选择,
如果您可以使用 str_replace,例如:
error_log("test\n" . str_replace('\"',"\n",json_encode($json_string, JSON_PRETTY_PRINT)));
或者像@Karoly Horvath 说的那样:
您对一个已经在 JSON 中编码的字符串进行编码。您的 $json_string 已经编码。所以你需要解码你的第一个JSON并用好的参数重新编码它
error_log("test\n" . json_encode(json_decode($json_string), JSON_PRETTY_PRINT));
感谢@Karoly。
error_log("test\n" . json_encode($json_string, JSON_PRETTY_PRINT));
json_encode()
实际上不一定会产生JSON:它会产生一些可以被javascript读取的东西。如果你给它一个数组或一个对象,它会产生 JSON;如果你给它一个字符串,它会产生一个 javascript 字符串。这就是你正在做的,所以这就是你得到的。
明确地说,$json_string
是一个 字符串 :(就 PHP 而言,它是一个字符串;如果您传递相同的字符串javascript,它将被解释为一个对象)。你通过 json_encode()
传递它,你将得到的只是另一个字符串(双重编码的字符串 JSON)。
JSON_PRETTY_PRINT
在这里没有效果,因为你没有生成 JSON:你生成的东西 javascript 也会被视为字符串。
精明?
所以您需要做的是 (a) 将 $json_string
变回 PHP 数组,然后 (b) 将其重新编码为 JSON,这次使用JSON_PRETTY_PRINT
标志。
$log_array = json_decode($json_string, true);
$json_pretty_string = json_encode($log_array, JSON_PRETTY_PRINT);
error_log('test' . PHP_EOL . $json_pretty_string);
与其将其转换回 PHP 数组然后再转换回 JSON,不如将 JSON_PRETTY_PRINT
标志添加到您获得 [=13] 的任何位置=] 如果可能的话,从第一位开始。
或者,直接记录$json_string
(无需编码:它已经是一个字符串,你可以将它原样传递给error_log()
),并且只在你担心美化它时需要阅读 你的日志。这将使您的日志显着变小。
常见的 unix 错误日志不应包含人类可读的 json 或其他未转义的字符。许多 syslog/logging 实现受字符宽度限制并自动添加编码(如 \"
)或删除换行符,PHP 的 error_log 也不是二进制安全的 - 行为当遇到 unicode 字符时是不可预测的(不确定)。
您不应该使用本机 syslog/error 日志函数,相反, 构建您自己的记录器,专用于 json 日志记录。
我个人使用 MongoDB 来记录 json,因为它是 MongoDB 应该使用的数据类型。