2013-05-16 3 views
2

Извините, если это было задано тысячу раз, но я не могу найти хороший учебник о том, как это сделать правильно, и поиск по стеку идет вверх по козырям.Получение данных JSON с PHP

У меня есть файл в формате JSON, который имеет данные, как это:

{ 
     "store":"Store 1", 
     "cat":"Categories", 
     "general_cat":"Categories", 
     "spec_cat":"Accessories" 
    }, 
    { 
     "store":"Store 1", 
     "cat":"Categories", 
     "general_cat":"Categories", 
     "spec_cat":"Accessories" 
    }, 

с около 50 записей в нем. Я пытаюсь разобрать эти данные и сохранить значения в переменных.

До сих пор я пытался:

$string  = file_get_contents("jsonFile.json"); 
$json_array = json_decode($string,true); 

foreach ($json_array as $key => $value){ 

    $store = $key -> store; 
    $general_cat = $key -> general_cat; 
    $spec_cat = $key -> spec_cat; 

    if (!is_null($key -> mainImg_select)){ 
     $cat = $key -> cat; 
    } 

    echo $headURL; 
} 

Это приводит к «Попытка получить свойство объекта, не являющихся» ошибок. Что я здесь делаю неправильно?

+1

Первой, ваш код JSON не семантический правильно. Список объектов должен быть между '[' и ']' like '[{...}, {...}]'. Во-вторых, вы используете значение 'true' для второго параметра' json_decode'. Если для него установлено значение true, вы не будете манипулировать объектом, а ассоциативными массивами. Таким образом, '$ key-> store' не будет доступен. В то же время это может быть вместо $ value ["store"] '. – MatRt

+0

JSON находится между квадратными скобками, я просто показывал, как хранятся данные.Я попытался установить второе значение json_decode в значение false, но это все равно дает мне ошибки, отличные от объекта. – Jascination

+1

Это потому, что вам нужно использовать '$ value', а не' $ key'. Пожалуйста, полностью прочтите мой ответ. После 'json_decode',' $ json_array' представляет собой массив ассоциативных массивов. Таким образом, '$ key' является числовым индексом и' $ value' массивом, которым вы стремитесь манипулировать. – MatRt

ответ

11

Второй аргумент json_decode сообщает функции, следует ли возвращать данные в качестве объекта или массива.

Доступ к объекту использует символ ->. Чтобы вернуть объект из json_decode либо использовать json_decode($jsonString) или json_decode($jsonString, false) (второй аргумент false by default)

$jsonString = '{ "this_is_json" : "hello!" }'; 

$obj = json_decode($jsonString); 

echo $obj->this_is_json // "hello!"; 

Вы также можете получить доступ к данным JSON в массив, установив второй аргумент true

$jsonString = '{ "this_is_json" : "hello!" }'; 

$arr = json_decode($jsonString, true); 

echo $arr['this_is_json'] // "hello!"; 

Что может быть немного более концептуально запутанным, заключается в том, что PHP json_decode может возвращать либо массив объектов (а не только объект), либо ассоциативный массив.

Рассмотрите следующую строку json. Эта строка представляет собой «коллекцию» (квадратные скобки) структур данных json (фигурные скобки).

[ 
    { 
     "name": "One" 
    }, 
    { 
     "name": "Two" 
    } 
] 

Если мы относим этот JSON к переменным $string надеюсь, это будет показана разница

$asObjects = json_decode($string); 

$asAssociativeArray = json_decode($string, true); 

foreach ($asObjects as $obj) { 
    echo $obj->name; 
} 

foreach ($asAssociativeArray as $arr) { 
    echo $arr['name']; 
} 
4

Похоже, вы запрашиваете ассоциативный массив (передавая True как второй параметр функции json_decode), но пытающийся использовать его как объект.

Пробег: $json_array = json_decode($string,false);. Это будет возвращать объекты

Кроме того, как отмечает @MatRt, вам нужно использовать $ значение вместо $ ключа для ссылки на объектах

3

Вам нужно получить значение с синтаксисом массива:

$item['key'] 

, как соединенный с

$item->key 
+0

Это избавляет от ошибок, но переменные пустые - когда я использую '\t $ store = $ key ['store'];' затем попробуйте 'print_r ($ store);' Я получаю пустой экран – Jascination

+0

try foreach ($ json_array как $ key) – DeweyOx

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