Правильно создать JSON-объект

108

Я пытаюсь создать объект JSON из массива PHP. Массив выглядит так:

$post_data = array('item_type_id' => $item_type,
    'string_key' => $string_key,
    'string_value' => $string_value,
    'string_extra' => $string_extra,
    'is_public' => $public,
    'is_public_for_contacts' => $public_contacts);

Код для кодирования JSON выглядит так:

$post_data = json_encode($post_data);

В итоге файл JSON должен выглядеть так:

{
    "item": {
        "is_public_for_contacts": false,
        "string_extra": "100000583627394",
        "string_value": "value",
        "string_key": "key",
        "is_public": true,
        "item_type_id": 4,
        "numeric_extra": 0
    }
} 

Как я могу инкапсулировать созданный код JSON в «элемент»: {КОД JSON ЗДЕСЬ}.

Марк Денн
источник

Ответы:

162

Обычно вы делаете что-то вроде этого:

$post_data = json_encode(array('item' => $post_data));

Но, поскольку кажется, что вы хотите, чтобы вывод был с " {}", вам лучше убедиться, что вы принудительно json_encode()кодируете как объект, передавая JSON_FORCE_OBJECTконстанту.

$post_data = json_encode(array('item' => $post_data), JSON_FORCE_OBJECT);

{}Скобки " " определяют объект, а " []" используются для массивов в соответствии со спецификацией JSON.

Кристиан
источник
я бы добавил JSON_FORCE_OBJECTвjson_encode($arr, JSON_FORCE_OBJECT)
Adam Lukaszczyk
Это верно? $ post_data = json_encode (массив ('item' => $ post_data), JSON_FORCE_OBJECT);
Mark Denn
1
возможно, это будет полезно для кого-то - jsonwrapper boutell.com/scripts/jsonwrapper.html json_(en|de)code для более ранних версий PHP
robertbasic
что, если у меня есть массив где-то внутри $post_data. Это сделало бы их тоже объектами, верно?
ProblemsOfSumit
echo json_encode (array ('item' => $ post_data)); создаст структуру JSON: Object, Array, Object. или: {[{Это именно то, что я искал, импортировав ответ MySQL JSON в приложение iOS :-) СПАСИБО, Кристиан !!!
Джейкоб Топпинг,
63

Хотя другие ответы, размещенные здесь, работают, я считаю более естественным следующий подход:

$obj = (object) [
    'aString' => 'some string',
    'anArray' => [ 1, 2, 3 ]
];

echo json_encode($obj);
theDmi
источник
1
Такой хороший ответ. Также, когда вы не контролируете, когда именно объект будет кодироваться или если вы хотите кодировать массив объектов: тогда ответ JSON_FORCE_OBJECT не работает. С другой стороны гораздо читабельнее. Спасибо!
Natxet
Если вы ищете код, который начинается как объект и продолжает содержать массивы, это ваш ответ.
suchislife
31

Вам просто нужен еще один слой в вашем массиве php:

$post_data = array(
  'item' => array(
    'item_type_id' => $item_type,
    'string_key' => $string_key,
    'string_value' => $string_value,
    'string_extra' => $string_extra,
    'is_public' => $public,
   'is_public_for_contacts' => $public_contacts
  )
);

echo json_encode($post_data);
Zeusstl
источник
1
$post_data = [
  "item" => [
    'item_type_id' => $item_type,
    'string_key' => $string_key,
    'string_value' => $string_value,
    'string_extra' => $string_extra,
    'is_public' => $public,
    'is_public_for_contacts' => $public_contacts
  ]
];

$post_data = json_encode(post_data);
$post_data = json_decode(post_data);
return $post_data;
Алауддин Афиф Кассандра
источник
1

Вы можете json закодировать общий объект.

$post_data = new stdClass();
$post_data->item = new stdClass();
$post_data->item->item_type_id = $item_type;
$post_data->item->string_key = $string_key;
$post_data->item->string_value = $string_value;
$post_data->item->string_extra = $string_extra;
$post_data->item->is_public = $public;
$post_data->item->is_public_for_contacts = $public_contacts;
echo json_encode($post_data);
Митеш
источник