簡體   English   中英

如何json_encode php數組但沒有引號的鍵

[英]How to json_encode php array but the keys without quotes

我正在嘗試用一些數據繪制(使用Flot )餅圖

var data = <?php echo json_encode($data)?>

我從中得到的結果是:

var data = [
{"label":"Crear Usuario", "data":"2"},
{"label":"Impresoras", "data":"1"},
{"label":"Problema Correo", "data":"1"},
{"label":"Requisicion Equipo", "data":"1"},
{"label":"Sitio Web", "data":"1"}
]

這里的問題是我需要沒有引號的labeldata ,我已經嘗試過json_encode($data, JSON_NUMERIC_CHECK); 但只從數字中刪除引號。

以下格式是我需要的:

var data = [
    {label:"Crear Usuario",data:2}, ...

首先,您必須在 php 中生成數組,以便數據的值是整數,而不是字符串:

我從你的 json_encode() 模擬了你的數組,我想它看起來像這樣(或者應該):

$array =  array(
                array("label" => "Crear Usuario",   "data" => 2),
                array("label" => "Impresoras",      "data" => 1),
                array("label" => "Problema Correo", "data" => 1),
                array("label" => "Requisicion Equipo", "data" => 1),
                array("label" => "Sitio Web", "data" => 1)
            );

    $data = json_encode($array);
  • 請注意,2 和 1 未加引號,因此它們是整數,這很重要。

然后你在 Javascript 中缺少 JSON.parse() 來實際將該輸出轉換為一個 json 對象:

<script>
    var data = '<?php echo $data; ?>';
    var json = JSON.parse(data);
    console.log(json);
    console.log(json[0]);
</script>
  • 請注意 var data = ... 是單引號,因此您可以將來自 php 的回顯作為字符串

console.log() 為我輸出這個:

[Object, Object, Object, Object, Object] // First console.log(): one object with the 5 Objects. 
Object {label: "Crear Usuario", data: 2} // secons console log (json[0]) with the first object 

看起來像你需要的,對嗎?

帶引號和不帶引號的鍵之間沒有區別。 問題在於實際數據值周圍的引用,因為 Flot 需要數字,而不是字符串。

json_encode 函數根據您提供的數據類型決定是否引用。 在這種情況下,看起來您為創建 $data 執行的任何操作都在生成字符串值而不是整數。 您需要重新檢查這些操作,或者明確地告訴 PHP 將它們解釋為數字,使用 (int) 或 (float) 轉換,或 intval/floatval 函數。

嘗試這樣的事情:

function buildBrokenJson( array $data ) {

   $result = '{';

   $separator = '';
   foreach( $data as $key=>$val ) {
      $result .= $separator . $key . ':';

      if( is_int( $val ) ) {
         $result .= $val;
      } elseif( is_string( $val ) ) {
         $result .= '"' . str_replace( '"', '\"', $val) . '"';
      } elseif( is_bool( $val ) ) {
         $result .= $val ? 'true' : 'false';
      } else {
         $result .= $val;
      }

      $separator = ', ';
   }

   $result .= '}';

   return $result;
}

當運行時

$a = array("string"=>'Crear "Usuario', 'foo'=>':', "int"=>2, "bool"=>false);
var_dump( buildBrokenJson($a) );

它給:

string(54) "{string:"Crear \"Usuario", foo:":", int:2, bool:false}"

我創建了一個類來用 php 格式化 json,這里的鍵上沒有引號

class JsonFormatter
{
static $result = '';
static $separator = '';

public static function iterateArray($data) : string
{
    static::$result .= '[';
    static::$separator = '';
    foreach ($data as $key => $val) {
        if (is_int($val)) {

        } elseif (is_string($val)) {
            static::$result .= '"' . str_replace('"', '\"', $val) . '"';
        } elseif (is_bool($val)) {
            static::$result .= $val ? 'true' : 'false';
        } elseif (is_object($val)) {
            static::iterateObject($val);
            static::$result .= ', ';
        } elseif (is_array($val)) {
            static::iterateArray($val);
            static::$result .= ', ';
        } else {
            static::$result .= $val;
        }
        if (!is_int($val)) {
            static::$separator = ', ';
        }
    }

    static::$result .= ']';
    return static::$result;
}

public static function iterate($data)
{
    if (is_array($data)) {
        static::iterateArray($data);
    } elseif (is_object($data)) {
        static::iterateObject($data);
    }
    return static::$result;
}

public static function iterateObject($data)
{
    static::$result .= '{';
    static::$separator = '';
    foreach ($data as $key => $val) {

        static::$result .= static::$separator . $key . ':';

        if (is_int($val)) {
            static::$result .= $val;
        } elseif (is_string($val)) {
            static::$result .= '"' . str_replace('"', '\"', $val) . '"';
        } elseif (is_bool($val)) {
            static::$result .= $val ? 'true' : 'false';
        } elseif (is_object($val)) {
            static::iterate($val, true);
            static::$result .= ', ';
        } elseif (is_array($val)) {
            static::iterateArray($val, true);
            static::$result .= ', ';
        } else {
            static::$result .= $val;
        }
        static::$separator = ', ';
    }
    static::$result .= '}';
    return static::$result;
}

}

你現在可以打電話

$jsonWithoutKeyQuotes  = JsonFormatter::iterate($data);

感謝 Marcin Orlowski

TL;DR:缺少引號是 Chrome 顯示它是 JSON 對象而不是字符串的方式。 確保您有 Header('Content-Type: application/json; charset=UTF8'); 在 PHP 的 AJAX 響應中解決了真正的問題。

細節:想要解決這個問題的一個常見原因是因為在調試返回的 AJAX 數據的處理時發現了這個差異。

就我而言,我使用 Chrome 的調試工具看到了不同之處。 當連接到舊系統時,成功后,Chrome 顯示根據調試器,響應中的鍵周圍沒有顯示引號。 這允許在不使用 JSON.parse() 調用的情況下立即將對象視為對象。 調試我的新 AJAX 目標時,響應中顯示了引號,並且變量是字符串而不是對象。
當我在外部測試 AJAX 響應時,我終於意識到了真正的問題,看到遺留系統實際上在鍵周圍有引號。 這不是 Chrome 開發工具顯示的內容。 唯一的區別是在遺留系統上有一個指定內容類型的標頭。 我將它添加到新的 (WordPress) 系統中,現在調用與原始腳本完全兼容,並且成功函數可以將響應作為對象處理,無需任何解析。 現在我可以在舊系統和新系統之間切換,除了目標 URL 之外沒有任何更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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