【问题标题】:JSON_ENCODE tries to escape doubleJSON_ENCODE 试图逃避双重
【发布时间】:2013-02-11 16:48:48
【问题描述】:

我正在使用此控制器从我的数据库中获取数据,然后将它们作为有效的 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 url 时得到的结果:

[{"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 添加一个选项,使其不会转义这些双引号吗?

【问题讨论】:

  • 第一个输出有什么问题?当您使用getJSON 时,它假定数据是 JSON 并相应地对其进行解析。但如果你只是在浏览器中访问 URL,它就不会这样做。
  • 我编辑帖子以写下第一个输出发生的情况。
  • 我编辑了它。我得到一个带有 [object] [object] 字符串的列表。
  • val 是一个类似{"id":1,"iam":1,"youare":2,"lat":50.8275853,"lng":4.3809764,"msgbody":"I saw you over there what's up!"} 的对象。您需要从中选择一个特定的属性,例如val.msgbody.
  • 谢谢,这行得通。所以将 Content-Type 设置为 application/json 并不是很重要吗?因为现在是 Content-Type:text/html; ...(添加您的评论作为答案,以便我可以选择它!)

标签: php symfony escaping json


【解决方案1】:

如果你依赖Content-Type,使用header()设置合适的:

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

【讨论】:

  • 我添加了 $serializer->headers->set('Content-Type', 'application/json');但是 Symfony 会抛出一个错误:Notice: Trying to get property of non-object
  • 那是因为$serializer = $serializer-&gt;serialize(...) 用字符串替换了 Serializer 对象。不要这样重用变量。
  • 你能告诉我我该怎么做吗,因为我尝试了许多不同的组合,但没有任何效果..我需要返回一个应该包含我的内容的“响应”..我该如何更改它的标题?
  • 我将代码更改为 $response = $serializer->serialize($message, 'json'); $response->headers->set('Content-Type', 'application/json');返回新的响应($响应);但我收到通知:尝试在 C:\wamp\www\src\Acme\StoreBundle\Controller\DefaultController.php 第 55 行中获取非对象的属性
【解决方案2】:

变化:

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 来决定如何解析它。

【讨论】:

  • 谢谢,我也会尝试管理发送内容类型,因为我计划使用不同的 JS 框架(Ember 或主干),我认为在这种情况下这很重要......以防万一你知道你在 php/symfony 中的方式
猜你喜欢
  • 1970-01-01
  • 2020-11-25
  • 2016-03-10
  • 1970-01-01
  • 2011-06-05
  • 2011-03-10
  • 1970-01-01
  • 2018-06-14
  • 2011-06-01
相关资源
最近更新 更多