23

いくつかのデータを含む円グラフを( 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}, ...
4

5 に答える 5

15

まず、データの値が文字列ではなく整数になるように、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 =...はSINGLEQUOTEDであるため、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 

あなたが必要なもののように見えます、私は正しいですか?

于 2012-11-23T16:51:11.473 に答える
8

引用符で囲まれたキーと引用符で囲まれていないキーに違いはありません。Flotは文字列ではなく数値を必要とするため、問題は実際のデータ値を引用することです。

json_encode関数は、提供するデータのタイプに基づいて引用するかどうかを決定します。この場合、$ dataを作成するために実行している操作はすべて、整数ではなく文字列値を生成しているように見えます。(int)または(float)キャスト、またはintval / floatval関数を使用して、これらの操作を再検討するか、PHPに数値として解釈するように明示的に指示する必要があります。

于 2012-11-23T13:38:43.500 に答える
4

次のようなものを試してください。

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}"
于 2012-11-23T06:09:09.993 に答える
1

ここでキーに引用符を付けずに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);

MarcinOrlowskiに感謝します

于 2018-08-27T15:04:35.007 に答える
0

TL; DR:引用符がないのは、Chromeが文字列ではなくJSONオブジェクトであることを示す方法です。Header('Content-Type:application / json; charset = UTF8');があることを確認してください。実際の問題を解決するためのPHPのAJAX応答で。

詳細:この問題を解決したい一般的な理由は、返されたAJAXデータの処理をデバッグしているときにこの違いを見つけるためです。

私の場合、Chromeのデバッグツールを使用して違いがわかりました。レガシーシステムに接続すると、Chromeは成功すると、デバッガーによると、応答のキーの前後に引用符が表示されないことを示しました。これにより、JSON.parse()呼び出しを使用せずに、オブジェクトをすぐにオブジェクトとして扱うことができました。新しいAJAX宛先をデバッグすると、応答に引用符が表示され、変数は文字列であり、オブジェクトではありませんでした。
AJAX応答を外部でテストしたときに、レガシーシステムが実際にキーの周りに引用符を持っているのを見て、最終的に本当の問題に気づきました。これは、Chrome開発ツールが示したものではありませんでした。唯一の違いは、レガシーシステムにはコンテンツタイプを指定するヘッダーがあったことです。これを新しい(WordPress)システムに追加すると、呼び出しは元のスクリプトと完全に互換性があり、success関数は解析を必要とせずに応答をオブジェクトとして処理できました。これで、リンク先URL以外は​​変更せずに、レガシーシステムと新しいシステムを切り替えることができます。

于 2019-07-11T00:03:24.670 に答える