2013-02-11 4 views
0

Я использую этот контроллер для извлечения данных из моей базы данных, а затем отправляю их как действительные данные JSON, но мой HTTP-ответ, хотя имеет действительный JSON, это текст/html вместо application/json, поэтому getJSON doesn ' т работы. (Если 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 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, чтобы он не избежал этих двойных кавычек?

+0

Что случилось с первым выходом? Когда вы используете 'getJSON', он предполагает, что данные JSON и анализируют его соответствующим образом. Но если вы просто посещаете URL-адрес в браузере, он этого не делает. – Barmar

+0

Я редактирую сообщение, чтобы написать, что происходит с первым выходом. –

+0

Я его отредактировал. Я получаю список со строками [object] [object]. –

ответ

1

Изменение:

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

к:

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

Вам не нужно установите Content-type при использовании $.getJSON - он предполагает, что выход - JSON. Вам это нужно, если вы используете более общие методы, такие как $.get, $.post, или $.ajax. Все они позволяют вам указать опцию dataType: 'json', чтобы сказать, что вывод также JSON, но если вы не укажете опцию, они рассмотрят Content-type, чтобы решить, как ее разобрать.

+0

спасибо, я также попытаюсь управлять отправкой содержимого, так как Я планирую использовать различные JS-рамки (Ember или позвоночник), и я думаю, что в этом случае это будет иметь значение ... если вы знаете свой путь в php/symfony –

2

Если вы зависите от Content-Type, используйте header() установить соответствующий один:

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

Я добавил $ serializer-> headers-> set ('Content-Type', 'application/json'); но Symfony выдает сообщение об ошибке: Примечание: попытка получить свойство не-объекта –

+0

Это потому, что '$ serializer = $ serializer-> serialize (...)' заменяет объект Serializer строкой. Не используйте повторно такую ​​переменную. – Barmar

+0

Не могли бы вы рассказать мне, как я могу это сделать, потому что я пробовал много разных комбинаций, но ничего не работал. Мне нужно вернуть «ответ», который должен содержать мой контент. Как мне изменить его заголовки? –

Смежные вопросы