Utwórz obiekt JSON we właściwy sposób

107

Próbuję utworzyć obiekt JSON z tablicy PHP. Tablica wygląda następująco:

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

Kod do zakodowania JSON wygląda następująco:

$post_data = json_encode($post_data);

Ostatecznie plik JSON ma wyglądać następująco:

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

Jak mogę zawrzeć utworzony kod JSON w „elemencie”: {TUTAJ KOD JSON}.

Mark Denn
źródło

Odpowiedzi:

161

Zwykle zrobiłbyś coś takiego:

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

Ale ponieważ wydaje się, że chcesz, aby wyjście było z " {}", lepiej upewnij się, że json_encode()wymuszasz kodowanie jako obiekt, przekazując JSON_FORCE_OBJECTstałą.

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

{}Nawiasy „ ” określają obiekt, a „ []” są używane dla tablic zgodnie ze specyfikacją JSON.

Cristian
źródło
dodałbym JSON_FORCE_OBJECTinjson_encode($arr, JSON_FORCE_OBJECT)
Adam Łukaszczyk
Czy to jest poprawne? $ post_data = json_encode (array ('item' => $ post_data), JSON_FORCE_OBJECT);
Mark Denn,
1
może to będzie pomocne dla kogoś - jsonwrapper boutell.com/scripts/jsonwrapper.html json_(en|de)code dla wcześniejszych wersji PHP
robertbasic
co jeśli mam gdzieś zagnieżdżoną tablicę $post_data. To uczyniłoby z nich również obiekty, prawda?
ProblemsOfSumit
echo json_encode (array ('item' => $ post_data)); utworzy strukturę JSON: Object, Array, Object. lub: {[{Dokładnie tego szukałem, importując odpowiedź MySQL JSON do aplikacji na iOS :-) DZIĘKUJĘ Cristian !!!
Jacob Topping
63

Chociaż inne zamieszczone tutaj odpowiedzi działają, uważam następujące podejście za bardziej naturalne:

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

echo json_encode($obj);
theDmi
źródło
1
Ta odpowiedź jest tak dobra. Również wtedy, gdy nie kontrolujesz dokładnie, kiedy obiekt ma zostać zakodowany lub jeśli chcesz zakodować tablicę obiektów: wtedy odpowiedź JSON_FORCE_OBJECT nie działa. Z drugiej strony jest dużo bardziej czytelny. Dzięki!
Natxet
Jeśli szukasz kodu, który zaczyna się jako obiekt, a następnie zawiera tablice, to jest twoja odpowiedź.
suchislife
31

Potrzebujesz tylko kolejnej warstwy w swojej tablicy 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
źródło
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
źródło
1

Możesz json zakodować ogólny obiekt.

$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
źródło