Json_decode со специальными символами

У меня возникла большая проблема с отправкой данных через jQuery Ajax как JSON на мой сервер. JSLint говорит, что данные в порядке, а Content-Type запроса – application/x-www-form-urlencoded; charset=UTF-8 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" } ] } 

Редактировать:

Я попробовал это сейчас:

 $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-файл, она работает, но не получает ее из сообщения!

У вас возникла ошибка из-за новой строки в вашей строке

 $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) 

Голосование за новую строку тоже

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 и т. Д.),

 $string = preg_replace("/[\r\n]+/", " ", $string); $json = utf8_encode($string); $json = json_decode($json); var_dump($json);