Декодирование Json с помощью специальных символов


У меня возникла большая проблема с отправкой данных через jQuery Ajax в виде JSON на мой сервер. JSLint говорит, что данные в порядке, а тип содержимого запроса установлен в 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 - это данные post:$jdata = $this->input->post('requestdata');.

Вот несколько примеров захвата данных post из Поджигатель:

{
    "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);

Результат таков:

Строка(338) "{"номер проекта": "4444", "описание проекта": "4444", "статьи": [{"позиция": 1, "идентификатор статьи": 676, "онлайновый текст": "### Бехальтер; Группа I-III нач. Штюклисте, Спраше: ДЕ - Sprache: de"}, {"позиция": 2, "артикль_ид": 681, "онлайновый текст": "### Бехальтер; Группа I-III нач. Штюклисте, Спраше: ### - Sprache: ru"}]}" НОЛЬ

По вставка строки JSON непосредственно в исходный код PHP работает, но получение ее из post - нет!

Author: Peter O., 2012-10-16

3 answers

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

$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)
 11
Author: Baba, 2012-10-16 10:29:53

Тоже голосую за новую строку

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 (заголовок, подключение к бд и т. Д.)

 11
Author: Hafenkranich, 2013-05-01 10:08:34
$string = preg_replace("/[\r\n]+/", " ", $string);
$json = utf8_encode($string);
$json = json_decode($json);
var_dump($json);
 2
Author: sumit, 2016-01-21 17:46:32