我正在尝试用(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"}
]
这里的问题是我需要label
和data
没有引号,我已经尝试json_encode($data, JSON_NUMERIC_CHECK);
但只删除数字中的引号。
我需要以下格式:
var data = [
{label:"Crear Usuario",data:2}, ...
答案 0 :(得分:13)
首先,你必须在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);
然后你在Javascript中错过JSON.parse()来实际将输出变成json对象:
<script>
var data = '<?php echo $data; ?>';
var json = JSON.parse(data);
console.log(json);
console.log(json[0]);
</script>
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
看起来你需要什么,我是对的吗?
答案 1 :(得分:6)
引用键和不带引号的键之间没有区别。问题在于引用实际数据值,因为Flot需要数字,而不是字符串。
json_encode函数根据您提供的数据类型决定是否引用。在这种情况下,看起来您正在执行的创建$ data的操作正在生成字符串值而不是整数。您需要重新检查这些操作,或明确告诉PHP将它们解释为数字,使用(int)或(float)转换或intval / floatval函数。
答案 2 :(得分:3)
尝试这样的事情:
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}"
答案 3 :(得分:0)
我创建了一个用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
答案 4 :(得分:0)
TL; DR:缺少引号是Chrome显示它是JSON对象而不是字符串的方式。确保您具有Header('Content-Type:application / json; charset = UTF8');在PHP的AJAX响应中解决了实际问题。
详细信息: 想要解决此问题的常见原因是在调试返回的AJAX数据的处理过程中发现了这种差异。
就我而言,我看到了使用Chrome调试工具的不同之处。成功连接到旧系统后,Chrome表示调试器显示响应中的键周围没有引号。这允许将对象立即视为对象,而无需使用JSON.parse()调用。在调试新的AJAX目标时,响应中显示了引号,并且变量是字符串而不是对象。
当我在外部测试AJAX响应时看到真正的问题,当我看到旧系统实际上DID在密钥周围加上引号时,我终于意识到了真正的问题。这不是Chrome开发人员工具所显示的。
唯一的区别是,在旧系统上,有一个标头指定内容类型。我将此添加到新的(WordPress)系统中,并且这些调用现在与原始脚本完全兼容,并且成功函数可以将响应作为对象来处理,而无需任何解析。现在,我可以在旧系统和新系统之间切换,除了目标URL之外,无需进行任何更改。