2016-05-27 4 views
0

Привет Я пытаюсь декодировать строку с json-форматом в ассоциативный массив. Строка это: (Моя строка из базы данных и ее генерироваться там)PHP json_decode дает пустой массив

{ 
    "Parameter1":"<style> 
        #label-9 { 
        display: block; 
        text-align: left; 
        color: #fff; 
        } 
       </style>", 
    "HistoryPosition":"1" 
} 

И когда я json_decode() это дает мне пустой массив. Вы знаете, почему это происходит? Я считаю, что это что-то из «Параметра1», но не может найти, что это такое.

Спасибо :)

+4

Попробуйте [ 'json_last_error_msg'] (http://php.net/json-last-error-msg) и посмотрите, не вызывает ли это каких-либо проблем. –

+8

Я действительно верю, что это из-за разрывов строк, JSON не допускает реальных перерывов между линиями. – Akshay

+4

Akshay прав. см. http://www.json.org/string.gif, form-feed, new-line, return-каретки - все управляющие символы и поэтому не допускаются в строковом литерале. – VolkerK

ответ

1

JSONLint указывает, что JSON является недействительным.

Что вы можете сделать, это следующее

$json = '{ 
    "Parameter1":"<style> 
        #label-9 { 
        display: block; 
        text-align: left; 
        color: #fff; 
        } 
       </style>", 
    "HistoryPosition":"1" 
}'; 
// remove the newlines 
$clean = str_replace(["\r", "\n"], ['', ''], $json); 
var_dump(json_decode($clean)); 

Demo https://3v4l.org/X6KgM

+0

Есть ли способ вернуть разрывы строк после декодирования? – patricia

+0

Проблема в том, что у вас есть разрывы строк за пределами указанной области. Таким образом, вы не можете просто заменить разрывы строк на разрывы строк JS, иначе вы снова столкнетесь с недействительным JSON.Возможно, вы можете попробовать 'str_replace (';', '; \ n", $ yourvar-> Parameter1); 'вернуть некоторые из них обратно – Machavity

+0

Я мог бы это сделать, поскольку в моей базе данных при создании этой строки я не ставил разрывы строк за пределами указанной области. (Я просто помещаю его здесь, чтобы информация была читаемой. – patricia

1

Акшай действительно правильно, это вызвано переносами.

<pre><?php 

$input = <<<EOD 
{ 
    "Parameter1":"<style> 
        #label-9 { 
        display: block; 
        text-align: left; 
        color: #fff; 
        } 
       </style>", 
    "HistoryPosition":"1" 
} 
EOD; 

// json_decode($input, true); 
// echo json_last_error_msg(); // Syntax error 

$input = str_replace("\r", null, $input); 
$input = str_replace("\n", null, $input); 

var_dump(json_decode($input, true)); 

Печать:

array(2) { 
    ["Parameter1"]=> string(176) "<style>     #label-9 {     display: block;     text-align: left;     color: #fff;     }    </style>" 
    ["HistoryPosition"]=> string(1) "1" 
} 
1

Вместо почерк своей строки JSON, вы должны абсолютно использовать встроенные функции PHP, чтобы сделать ваш, как по крайней мере, 483% легче:

// Use a native PHP array to store your data; it will preserve the new lines 
$input = [ 
    "Parameter1" => "<style> 
        #label-9 { 
        display: block; 
        text-align: left; 
        color: #fff; 
        } 
       </style>", 
    "HistoryPosition" => "1" 
]; 

// This function will preserve everything in your strings 
$encoded_value = json_encode($input); 

// See your properly formatted JSON string 
echo $encoded_value.'<br><br>'; 

// Decode the string back into an associative PHP array 
echo '<pre>'; 
print_r(json_decode($encoded_value, true)); 
echo '</pre>'; 

Обновление на новую информацию о извлечения БД

json_last_error_msg(); производит эту ошибку:

Control character error, possibly incorrectly encoded

Если вы не заботитесь о сохранении новой строки, то это будет работать:

<?php 
$db_data = '{ 
    "Parameter1":"<style> 
        #label-9 { 
        display: block; 
        text-align: left; 
        color: #fff; 
        } 
       </style>", 
    "HistoryPosition":"1" 
}'; 

$db_data = str_replace("\r", "", $db_data); 
$db_data = str_replace("\n", "", $db_data); 

echo '<pre>'; 
print_r(json_decode($db_data, true)); 
echo '</pre>'; 
+0

Я не могу этого сделать, потому что данные сгенерированы и сохранены в базе данных. – patricia

+0

@patricia См. Мое обновление. – MonkeyZeus

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