json передача данных на сервер

E
На сайте с 05.07.2013
Offline
60
8757

помогите разобратся с json. Есть такой код:

var json = new Object();

json.html = encodeURIComponent($('html').html());
$.ajax({
url: 'json.php',
type: 'POST',
dataType: 'JSON',
data: 'json='+JSON.stringify(json),
success: function(result) {
$("#result").html(result);
}
});

json.php

$post = json_decode($_POST['json']);

echo json_last_error();
var_dump($post);

Соотвественно получаю ошибку 4(JSON_ERROR_SYNTAX) и нулл в $post.

Как правильно передавать данные на сервер, используя json? Данные для передачи могут быть любые, к примеру даже хтмл код этой страницы...

R
На сайте с 18.12.2009
Offline
92
#1


var json = new Object();
json.html = encodeURIComponent($('html').html());
$.ajax({
url: 'json.php',
type: 'JSON',
dataType: 'POST',
data: {json: JSON.stringify(json)},
success: function(result) {
$("#result").html(result.html);
}
});

json.php


$post = json_decode($_POST['json'], true);
echo json_encode($post);

Только зачем отдавать серверу json и возвращать json я так и не понял.

type: 'JSON' - это значит, что принимать данные Вы будете в формате json.

Например:

json.php


$post = array();
$post['name'] = 'Антон';
$post['age'] = '22';
echo json_encode($post);

И уже обрабатываете:


...
success: function(result) {
$("#result").append("Имя: " + result.name);
$("#result").append("Возраст: " + result.age);
}
...
T
На сайте с 19.09.2012
Offline
29
#2

egralvoid, покажите, что у вас видит скрипт в $_POST['json']:

в начале json.php:

print_r($_POST['json']);


---------- Добавлено 23.08.2013 в 10:31 ----------

И ещё вопрос (но он не отменяет предыдущего вопроса): для чего указываете dataType: 'JSON' (кстати, в документации - 'json', не проверял, есть ли разница) - если у Вас скрипт возвращает не данные JSON, а HTML? (который Вы потом используете как HTML, судя по строке $("#result").html(result); )

---------- Добавлено 23.08.2013 в 11:26 ----------

Проблему вижу в том, что encodeURIComponent заурленкодил все кавычки, а PHP автоматом их разурленкодил плюс добавил слэши ко всем кавычкам на всякий случай (magic quotes), и получилось, что JSON в функцию json_decode() передавался уже очень некорректный.

Восстановил пример у себя.

Теперь по делу - рабочий пример:


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script language="javascript"><!--
$(document).ready(function(){
var json = new Object();
json.html = $('html').html();
$.ajax({
url: 'jsonpost.php',
type: 'POST',
data: { 'json': JSON.stringify(json) } // дополнительное экранирование не делаем, т.к. возлагаем это на JQuery
}).done(function(data){
$("#result").html(data);
});
});
--></script>
</head>
<body>
<div id="result" style="white-space:pre; font-family:monospace;"></div>
<hr />
<h1>...</h1>
<p>....</p>
...
</body>
</html>

dataType: 'JSON' убрал, т.к. скрипт возвращает не JSON данные.

success заменил на .done(...), т.к. не стал разбираться, по какой именно причине он не срабатывал.

jsonpost.php:


<?php

// это на случай, если в php включены magic quotes - у меня лично получалось
// двойное экранирование кавычек, и естественно невалидный JSON
$json = get_magic_quotes_gpc() ? stripslashes($_POST['json']) : $_POST['json'];

$post = json_decode($json);

//var_dump($post);

// а это просто какой-то вариант обработки вместо var_dump...
$out = strip_tags($post->html); // убираем тэги (скрипты он не всегда вырезает)
$out = preg_replace("/\n+/", "\n", $out); // убираем повторные разрывы строки

// и вывод
echo $out;

В целях иллюстрирования - мой рабочий пример.

E
На сайте с 05.07.2013
Offline
60
#3

turen, Спасибо большое за помощь, разобрался. Похоже проблема была действительно в encodeURIComponent.

T
На сайте с 19.09.2012
Offline
29
#4
egralvoid:
turen, Спасибо большое за помощь, разобрался. Похоже проблема была действительно в encodeURIComponent.

плюс php magic quotes (лично у меня).

dkameleon
На сайте с 09.12.2005
Offline
386
#5

как раз вчера делал себе:


function APITest(url, data) {
$.ajax({
'url': url,
'type': 'POST',
'dataType': 'json',
'data': data,
'success': APIShow,
'error': function(jqXHR, textStatus, errorThrown ) {
alert('AJAX error: ' + textStatus + ' - ' + errorThrown);
}
});
return false;
}

APITest(url, JSON.stringify(data));

	$input = file_get_contents('php://input');
$input = json_decode($input, true);
Дизайн интерьера (http://balabukha.com/)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий