[英]php json_decode fails without quotes on key
我有這樣表示的json數據
{key:"value"}
(鍵周圍沒有引號...)
我想將其轉換為關聯數組。
PHP 的json_decode返回 null
如何在密鑰周圍添加引號? 謝謝...
您可以在源處修復 JSON 以使其返回有效的 JSON 結構,也可以手動在鍵周圍添加引號。
This answer to a similar question有一個如何做到這一點的例子:
function my_json_decode($s) {
$s = str_replace(
array('"', "'"),
array('\"', '"'),
$s
);
$s = preg_replace('/(\w+):/i', '"\1":', $s);
return json_decode(sprintf('{%s}', $s));
}
如果您無法在源代碼中將其轉換為有效的 JSON,那么您可以使用 PEAR 中的Services_JSON
來解析它,因為在鍵周圍添加引號是一個非常容易出錯的過程。
Services_JSON
將正確解析無效的密鑰字符串。
例子:
$json = new Services_JSON();
var_dump($json->decode('{key:"value"}'));
輸出:
object(stdClass)#2 (1) {
["key"]=>
string(5) "value"
}
為了避免在不應該插入雙引號的地方插入雙引號,您應該在此操作中跳過那些帶引號的字符串。
例如,如果您在字符串中有這個 JavaScript 對象字面量:
{
dt:"2016-10-22T09:13:20",
"x:y":false
}
...然后必須注意不要將22T09:
更改為"22T09":
。 同樣已經引用的鍵, "x:y"
應該保持不變。
您可以使用此正則表達式來實現:
preg_replace('/("(.*?)"|(\w+))(\s*:\s*(".*?"|.))/s', '"$2$3"$4', $text);
JavaScript 對象字面量允許帶有左填充零的數字常量,如001
和/或帶有一元+
符號,這在 JSON 中是不允許的。 要刪除這些有問題的字符,您可以使用此擴展版本:
preg_replace('/("(.*?)"|(\w+))(\s*:\s*)\+?(0+(?=\d))?(".*?"|.)/s', '"$2$3"$4$6', $text);
請不要使用正則表達式來做到這一點! 根據定義,無法以這種方式正確解析 JSON 語法。 您將面臨大量未來的錯誤。
我建議使用 YAML 解析器,因為 YAML 是 JSON 的超集,並且同時允許使用不帶引號的文字。
Symfony YAML 組件運行良好。
與本地實現的json_decode
相比, json_decode
性能損失。
$results = \Symfony\Component\Yaml\Yaml::parse("{a: d, b: 'c', e: [a, 3]}");
您可能只能使用該庫而不必使用整個 Symfony 包: https : //packagist.org/packages/symfony/yaml
對於這種情況,完全不建議使用 REGEX,不要使用它來解析此類數據。 如果您有一個簡單的目標並希望避免使用穩定的PEAR package
,那么您可以嘗試使用JSON-php
庫(但不再維護)。
1) 從這里獲取JSON.phps
文件並重命名為.php
並將構造函數名稱替換為__construct
。
2) 用法:
$content = '{myKey:"valueeeee"}';
include(__DIR__.'/JSON.php');
$this->json = new Services_JSON( SERVICES_JSON_LOOSE_TYPE ); // to return objects instead of Associative array, remove the argument
var_dump( $this->json->decode($content) );
這對我有用,使用正則表達式替換 '/\\s(\\w+)\\s/i'
$json = file_get_contents("php://input"); // or whatever json data
$json = preg_replace('/\s(\w+)\s/i', '"$1"', $json);
$json = json_decode($json, true);
根據文檔(參見示例 #3 - '使用 json_decode 的常見錯誤'),鍵必須用雙引號括起來。
你從哪里得到 JSON 數據?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.