JSON_ENCODE尝试转义为double

时间:2013-02-11 16:48:48

标签: php symfony escaping json

我正在使用此控制器从我的数据库中获取数据,然后将它们作为有效的JSON数据发回,但我的http响应虽然有有效的JSON,但它是text / html而不是application / json,因此getJSON不起作用。 (除非getJSON应该可以工作吗?)

  public function sendjsonAction()
  {
$encoders = array(new XmlEncoder(), new JsonEncoder());
$normalizers = array(new GetSetMethodNormalizer());
$serializer = new Serializer($normalizers, $encoders);

    $message = $this->getDoctrine()
    ->getRepository('AcmeStoreBundle:Message')
    ->findAll();
    $serializer = $serializer->serialize($message, 'json');
    return new Response($serializer);
}

这是我访问json网址时得到的内容:

[{“id”:1,“iam”:1,“youare”:2,“lat”:50.8275853,“lng”:4.3809764,“msgbody”:“我在那里看到你发生了什么事!”} ,{“id”:2,“iam”:1,“youare”:2,“lat”:50.8275853,“lng”:4.3809764,“msgbody”:“我在那里看到你发生了什么事!”},{“ id“:3,”iam“:1,”youare“:2,”lat“:50.8275853,”lng“:4.3809764,”msgbody“:”我在那里看到你发生了什么事!“},{”id“: 4,“iam”:1,“youare”:2,“lat”:50.8275853,“lng”:4.3809764,“msgbody”:“我在那里看到你发生了什么事!”},{“id”:5,“ iam“:1,”youare“:2,”lat“:50.8275853,”lng“:4.3809764,”msgbody“:”我在那里看到你发生了什么事!“},{”id“:6,”iam“: 1,“youare”:2,“lat”:50.8275853,“lng”:4.3809764,“msgbody”:“我在那里看到你发生了什么事!”}}

所以我有另一个名为“showall”的页面,其中包含以下Javascript:

$.getJSON('/app_dev.php/sendjson', function(data) {
  var items = [];

  $.each(data, function(key, val) {
    items.push('<li id="' + key + '">' + val + '</li>');
  });

  $('<ul/>', {
    'class': 'my-new-list',
    html: items.join('')
  }).appendTo('body');
});

JS的结果是这个html:

<ul class="my-new-list">
<li id="0">[object Object]</li>
<li id="1">[object Object]</li>
<li id="2">[object Object]</li>
<li id="3">[object Object]</li>
<li id="4">[object Object]</li>
<li id="5">[object Object]</li>
</ul>

如果我尝试使用json_encode,那么事情就会变得更加混乱......以下是我得到的答案:

"[{\"id\":1,\"iam\":1,\"youare\":2,\"lat\":50.8275853,\"lng\":4.3809764,\"msgbody\":\"I saw you over there what's up!\"},{\"id\":2,\"iam\":1,\"youare\":2,\"lat\":50.8275853,\"lng\":4.3809764,\"msgbody\":\"I saw you over there what's up!\"},{\"id\":3,\"iam\":1,\"youare\":2,\"lat\":50.8275853,\"lng\":4.3809764,\"msgbody\":\"I saw you over there what's up!\"},{\"id\":4,\"iam\":1,\"youare\":2,\"lat\":50.8275853,\"lng\":4.3809764,\"msgbody\":\"I saw you over there what's up!\"},{\"id\":5,\"iam\":1,\"youare\":2,\"lat\":50.8275853,\"lng\":4.3809764,\"msgbody\":\"I saw you over there what's up!\"},{\"id\":6,\"iam\":1,\"youare\":2,\"lat\":50.8275853,\"lng\":4.3809764,\"msgbody\":\"I saw you over there what's up!\"}]"

逃脱双引号......! 我应该为json_encode添加一个选项,以便它不会转义这些双引号吗?

2 个答案:

答案 0 :(得分:2)

如果您依赖Content-Type,请使用header()设置合适的一个:

header('Content-type: application/json');

答案 1 :(得分:1)

变化:

items.push('<li id="' + key + '">' + val + '</li>');

为:

items.push('<li id="' + key + '">' + val.msgbody + '</li>');

使用$.getJSON时无需设置Content-type - 它假定输出为JSON。如果您使用更通用的方法,例如$.get$.post$.ajax,则需要它。它们都允许您指定dataType: 'json'选项以告诉它输出也是JSON,但是如果省略该选项,他们会查看Content-type来决定如何解析它。