Crea un objeto JSON de la manera correcta

107

Estoy tratando de crear un objeto JSON a partir de una matriz PHP. La matriz se ve así:

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

El código para codificar el JSON se ve así:

$post_data = json_encode($post_data);

Se supone que el archivo JSON se verá así al 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
    }
} 

¿Cómo puedo encapsular el código JSON creado en el "elemento": {CÓDIGO JSON AQUÍ}?

Mark Denn
fuente

Respuestas:

161

Por lo general, harías algo como esto:

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

Pero, como parece que desea que la salida sea con " {}", es mejor asegurarse de forzar la json_encode()codificación como objeto, pasando la JSON_FORCE_OBJECTconstante.

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

Los {}corchetes " " especifican un objeto y " []" se utilizan para matrices de acuerdo con la especificación JSON.

Cristian
fuente
Yo añadiría la JSON_FORCE_OBJECTdejson_encode($arr, JSON_FORCE_OBJECT)
Adam Lukaszczyk
¿Es esto correcto? $ post_data = json_encode (matriz ('elemento' => $ post_data), JSON_FORCE_OBJECT);
Mark Denn
1
tal vez esto sea útil para alguien - jsonwrapper boutell.com/scripts/jsonwrapper.html json_(en|de)code para versiones anteriores de PHP
robertbasic
¿Qué pasa si tengo una matriz en algún lugar anidado dentro $post_data? Esto también los convertiría en objetos, ¿correcto?
ProblemsOfSumit
echo json_encode (matriz ('elemento' => $ post_data)); creará la estructura JSON de: Object, Array, Object. o: {[{Que es exactamente lo que estaba buscando, importando la respuesta JSON de MySQL a una aplicación iOS :-) ¡¡¡GRACIAS Cristian !!!
Jacob Topping
63

Aunque las otras respuestas publicadas aquí funcionan, encuentro el siguiente enfoque más natural:

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

echo json_encode($obj);
theDmi
fuente
1
Esta respuesta es tan buena. Además, cuando no controla exactamente cuándo se codificará un objeto o si desea codificar una matriz de objetos: entonces la respuesta JSON_FORCE_OBJECT no funciona. Por otro lado es mucho más legible. ¡Gracias!
Natxet
Si está buscando una codificación que comience como un objeto y proceda a contener matrices, esta es su respuesta.
suchislife
31

Solo necesita otra capa en su matriz 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
fuente
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
fuente
1

Puede codificar json un 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
fuente