簡體   English   中英

php json_decode 失敗,鍵上沒有引號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM