file_get_content и json_encode php

200
18 июля 2018, 14:10

Можете подсказать, почему подобный код (ниже), выводит такую ошибку Warning: Illegal string offset 'key'

file.json:
[{
    'key': {
        0: {
            'key0': "data-0-0",
            'key1': "data-0-1"
        },
        1: {
            'key0': "data-1-0",
            'key1': "data-1-1"
        }
    }
}]
index.php:
$json = json_encode( file_get_contents( 'file.json' ) );
var_dump ( $json['key'] );

В файле, file.json нет никаких дополнительных символов.

Answer 1

Причины аж сразу три. И ни одна не имеет никакого отношения к file_get_contents

Первая: представленный file.json вы называете JSON по какому-то заблуждению. Он нарушает соответствующий RFC используя одинарные кавычки для строковых значений имён свойств. Затем, ключи 0: не могут быть так записаны, это должен быть или массив объявленный через использование квадратных скобок либо ключи должны быть взяты в кавычки как строки. Поэтому json_decode вовсе прочитать структуру не может.

Второе: потому что нет у вас в JSON на верхнем уровне объекта с ключом key. У вас есть массив из одного объекта, в котором есть свойство key.

И третья ошибка - вы вызываете json_decode без второго параметра. Соответственно у вас вообще никогда не получится массив с ассоциативными ключами: будет или массив с числовыми ключами или объект класса stdClass для массива и объекта JSON документа соответственно.

Вот в таком виде - смысл имеет:

$input = <<<JSON
[{
    "key": {
        "0": {
            "key0": "data-0-0",
            "key1": "data-0-1"
        },
        "1": {
            "key0": "data-1-0",
            "key1": "data-1-1"
        }
    }
}]
JSON;
$json = json_decode($input, true);
var_dump($json[0]['key']);

Отдельного вопроса заслуживает заявленная в заголовке ошибка Warning: Illegal string offset 'key'. Её так получить вовсе не выйдет, ошибка связана с попыткой обращения к строке как массиву с символьным ключом. Например, если вы json_decode не делаете вовсе.

Итог в общем-то един, смотрите на то что получаете через тот же var_dump и анализируйте следующие необходимые шаги до нужных вам данных.

READ ALSO
Редактирование файла с новостями в php

Редактирование файла с новостями в php

Есть файл с новостями (нельзя использовать sql)Каждая третья строка является названием статьи

179
В чем проблема на php не выдаёт результат

В чем проблема на php не выдаёт результат

В чем ошибка? Не выдаёт результат

196
Преобразование url и Redirect (.htaccess)

Преобразование url и Redirect (.htaccess)

Происходит редирект

213
Почему нельзя сделать return echo?

Почему нельзя сделать return echo?

Конструкция return require '/path/to/filehtml'; работает

209