Crie um objeto JSON da maneira correta

107

Estou tentando criar um objeto JSON de uma matriz PHP. A matriz é semelhante a esta:

$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);

O código para codificar o JSON é assim:

$post_data = json_encode($post_data);

O arquivo JSON deve ter a seguinte aparência no final:

{
    "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
    }
} 

Como posso encapsular o código JSON criado no "item": {JSON CODE HERE}.

Mark Denn
fonte

Respostas:

161

Normalmente, você faria algo assim:

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

Mas, como parece que você quer que a saída seja " {}", é melhor forçar json_encode()a codificação como objeto, passando a JSON_FORCE_OBJECTconstante.

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

" {}" colchetes especificam um objeto e " []" são usados ​​para matrizes de acordo com a especificação JSON.

Cristian
fonte
Eu adicionaria o JSON_FORCE_OBJECTemjson_encode($arr, JSON_FORCE_OBJECT)
Adam Lukaszczyk
Isso está correto? $ post_data = json_encode (array ('item' => $ post_data), JSON_FORCE_OBJECT);
Mark Denn
1
talvez isso seja útil para alguém - jsonwrapper boutell.com/scripts/jsonwrapper.html json_(en|de)code para versões anteriores do PHP
robertbasic
e se eu tiver uma matriz em algum lugar aninhada dentro $post_data. Isso os tornaria objetos também, correto?
ProblemsOfSumit
echo json_encode (array ('item' => $ post_data)); irá criar a estrutura JSON de: Object, Array, Object. ou: {[{que é exatamente o que eu estava procurando, importando a resposta JSON do MySQL para um aplicativo iOS :-) OBRIGADO Cristian !!!
Jacob Topping em
63

Embora as outras respostas postadas aqui funcionem, acho a seguinte abordagem mais natural:

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

echo json_encode($obj);
theDmi
fonte
1
Essa resposta é tão boa. Além disso, quando você não controla exatamente quando um objeto será codificado ou se deseja codificar uma matriz de objetos: a resposta JSON_FORCE_OBJECT não funciona. Por outro lado, é muito mais legível. Obrigado!
Natxet
Se você está procurando por uma codificação que começa como um objeto e continua a conter matrizes, esta é a sua resposta.
suchislife
31

Você só precisa de outra camada em seu array 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
fonte
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;
Alauddin Afif Cassandra
fonte
1

Você poderia codificar json um objeto genérico.

$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);
Mitesh
fonte