Json_decode со специальными символами
У меня возникла большая проблема с отправкой данных через jQuery Ajax как JSON на мой сервер. JSLint говорит, что данные в порядке, а для Content-Type запроса установлено значение application/x-www-form-urlencoded; charset=UTF-8
. Сервер работает на PHP 5.2.11, поэтому я не могу использовать json_last_error()
.
Я пробовал url_decode, utf8_decode и html_entities_decode, но ничего не работает.
var_dump(json_decode($jdata));
возвращает значение null, но если я делаю var_dump($jdata)
, все выглядит нормально. $jdata
- это данные сообщения: $jdata = $this->input->post('requestdata');
.
Вот несколько примеров, которые вы можете получить из Firebug:
{
"projectnumber": "345",
"projecdescription": "345",
"articles": [
{
"position": 1,
"article_id": 677,
"online_text": "3 Behälter; Band I-III nach indiv. Stückliste, Sprache: DE - Sprache: de"
},
{
"position": 2,
"article_id": 678,
"online_text": "2 Behälter; Band I-III nach indiv. Stückliste, Sprache: ### - Sprache: en"
}
]
}
Edit:
Я попробовал это сейчас:
$string = $this->input->post('requestdata');
var_dump($string);
$json = preg_replace('/,\s*([\]}])/m', '$1', utf8_encode($string));
$json = json_decode($json);
var_dump($json);
Результат:
string (338) "{" projectnumber ":" 4444 "," projecdescription ":" 4444 "," articles ": [{" position ": 1," article_id ": 676," online_text ":" ## # Behälter; Группа I-III nach indiv. Stückliste, Sprache: DE - Sprache: de "}, {" position ": 2," article_id ": 681," online_text ":" ### Behälter; Группа I-III nach indiv. Stückliste, Sprache: ### - Sprache: ru "}]}" NULL
Вставляя строку JSON прямо в исходный код PHP, она работает, но не получает ее из сообщения!
Ответы
Ответ 1
У вас возникла ошибка из-за новой строки в вашей строке
$string = '{"projectnumber" : "4444","projecdescription" : "4444", "articles" : [{"position":1, "article_id" : 676, "online_text" : "### Behälter; Band I-III nach indiv. Stückliste, Sprache: DE
- Sprache: de"},{"position":2, "article_id" : 681, "online_text" : "### Behälter; Band I-III nach indiv. Stückliste, Sprache: ###
- Sprache: en"}]}';
$string = preg_replace("/[\r\n]+/", " ", $string);
$json = utf8_encode($string);
$json = json_decode($json);
var_dump($json);
Выход
object(stdClass)[1]
public 'projectnumber' => string '4444' (length=4)
public 'projecdescription' => string '4444' (length=4)
public 'articles' =>
array
0 =>
object(stdClass)[2]
public 'position' => int 1
public 'article_id' => int 676
public 'online_text' => string '### Behälter; Band I-III nach indiv. Stückliste, Sprache: DE - Sprache: de' (length=78)
1 =>
object(stdClass)[3]
public 'position' => int 2
public 'article_id' => int 681
public 'online_text' => string '### Behälter; Band I-III nach indiv. Stückliste, Sprache: ### - Sprache: en' (length=79)
Ответ 2
Голосование для новой строки тоже
json_decode_nice + сохранить разрывы строк:
function json_decode_nice($json, $assoc = TRUE){
$json = str_replace("\n","\\n",$json);
$json = str_replace("\r","",$json);
$json = preg_replace('/([{,]+)(\s*)([^"]+?)\s*:/','$1"$3":',$json);
$json = preg_replace('/(,)\s*}$/','}',$json);
return json_decode($json,$assoc);
}
Если вы хотите, чтобы строки-строки просто выходили из слэша.
Вам не нужно кодировать utf-8, если все установлено на utf-8 (заголовок, соединение db и т.д.)
Ответ 3
$string = preg_replace("/[\r\n]+/", " ", $string);
$json = utf8_encode($string);
$json = json_decode($json);
var_dump($json);