2013-02-11 91 views
0

我使用这个控制器从我的数据库中获取数据,然后将它们作为有效的JSON数据发回,但我的http响应虽然有效的JSON,但它是text/html而不是application/json,所以getJSON不会'工作。 (除非的getJSON应该反正工作?)JSON_ENCODE试图逃脱双重

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添加一个选项,以便它不会转义这些双引号?

+0

第一个输出有什么问题?当你使用'getJSON'时,它假设数据是JSON并相应地解析它。但是,如果您只是在浏览器中访问网址,则不会这样做。 – Barmar 2013-02-11 16:59:05

+0

我编辑帖子来写出第一个输出会发生什么。 – 2013-02-11 17:01:01

+0

我编辑它。我用[object] [object]字符串得到一个列表。 – 2013-02-11 17:04:16

回答

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

+0

谢谢,我会尝试管理发送内容类型,因为我打算使用不同的JS框架(Ember或骨干),我认为在这种情况下,这将是重要的...如果你知道你的方式在PHP/symfony – 2013-02-11 17:21:24

2

如果你依赖于Content-Type,使用header()来设置相应的一个:

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

我添加了$ serializer-> headers-> set('Content-Type','application/json');但是Symfony会抛出一个错误:注意:试图获取非对象的属性 – 2013-02-11 17:08:30

+0

这是因为'$ serializer = $ serializer-> serialize(...)'用一个字符串替换了Serializer对象。不要重复使用那样的变量。 – Barmar 2013-02-11 17:11:10

+0

你能告诉我怎么做,因为我尝试了许多不同的组合,但没有任何工作..我需要返回一个“应答”,应该有我的内容..我如何更改它的标题? – 2013-02-11 17:15:14