Как декодировать строку JSON в PHP?

Мне также сказали, что [UIImage imageNamed:] делает немного слишком много кэширования, и изображения не часто выпускаются. Мне сказали остерегаться использования его.

5
задан Gumbo 12 August 2009 в 21:30
поделиться

9 ответов

print_r - ваш друг для выяснения структуры JSON.

<?php

$addresses = json_decode('{"addresses":{"address":[{"@array":"true","@id":"888888","@uri":"xyz","household":{"@id":"44444","@uri":"xyz"},"person":{"@id":"","@uri":""},"addressType":{"@id":"1","@uri":"xyz","name":"Primary"},"address1":"xyz","address2":null,"address3":null,"city":"xyz","postalCode":"111111"}]}}');

$_SESSION['address1'] = $addresses->addresses->address[0]->address1;
$_SESSION['address2'] = $addresses->addresses->address[0]->address2;
$_SESSION['address3'] = $addresses->addresses->address[0]->address3;
$_SESSION['city'] = $addresses->addresses->address[0]->city;
$_SESSION['postalCode'] = $addresses->addresses->address[0]->postalCode;

print_r($_SESSION);

Результаты в:

Array
(
    [address1] => xyz
    [address2] => 
    [address3] => 
    [city] => xyz
    [postalCode] => 111111
)
9
ответ дан 18 December 2019 в 11:59
поделиться

json_decode декодирует строку в формате json в объект PHP .

Попробуйте следующее:

$results = json_decode($address);
$results['address1'] = $results->addresses->address[0]->address1;
$results['address2'] = $results->addresses->address[0]->address2;
$results['address3'] = $results->addresses->address[0]->address3;
$results['city'] = $results->addresses->address[0]->city;
$results['postalCode'] = $results->addresses->address[0]->postalCode;

Изменить - обновлено, сначала я неправильно прочитал ваш JSON.

3
ответ дан 18 December 2019 в 11:59
поделиться

Обратите внимание, что эти поля «@array» и «@id» являются недопустимой нотацией JSON, и технически они приводят к неопределенному поведению в парсерах JSON.

2
ответ дан 18 December 2019 в 11:59
поделиться

Почему бы не декодировать всю строку JSON, а затем получить то, что вам нужно?

$address = '{"addresses":{"address":[{"@array":"true","@id":"888888","@uri":"xyz","household":{"@id":"44444","@uri":"xyz"},"person":{"@id":"","@uri":""},"addressType":{"@id":"1","@uri":"xyz","name":"Primary"},"address1":"xyz","address2":null,"address3":null,"city":"xyz","postalCode":"111111"}]}}';
$results = json_decode($address, true);
$address = $results['addresses']['address'][0];
print $address['address1'];
print $address['address2'];
print $address['postalCode'];
1
ответ дан 18 December 2019 в 11:59
поделиться

вы можете использовать print_r для вывода результатов $, чтобы точно узнать, как выглядит вывод объекта.

0
ответ дан 18 December 2019 в 11:59
поделиться

Может быть, попробуйте $ results ['адреса'] ['адрес'] ['адрес1'];

Не знаю, почему вы используете strstr. но не похоже, что в данном случае это что-то изменит.

0
ответ дан 18 December 2019 в 11:59
поделиться

json_decode ($ jsonData) возвращает объект btw, а не массив.

Например:

stdClass Object
(
    [addresses] => stdClass Object
        (
            [address] => Array
                (
                    [0] => stdClass Object
                        (
                            [@array] => true
                            [@id] => 888888
                            [@uri] => xyz
                            [household] => stdClass Object
                                (
                                    [@id] => 44444
                                    [@uri] => xyz
                                )

                            [person] => stdClass Object
                                (
                                    [@id] => 
                                    [@uri] => 
                                )

                            [addressType] => stdClass Object
                                (
                                    [@id] => 1
                                    [@uri] => xyz
                                    [name] => Primary
                                )

                            [address1] => xyz
                            [address2] => 
                            [address3] => 
                            [city] => xyz
                            [postalCode] => 111111
                        )

                )

        )

)

Способы доступа к данным:

$object = json_decode($jsonString);
$object->addresses->address[0]; // First address object
$object->addresses->address[0]->{"@array"}; // Not good way to access object property (damn @)
$object->addresses->address[0]->address1;
$object->addresses->address[0]->addressType->{"@id"}; // Again damn @
0
ответ дан 18 December 2019 в 11:59
поделиться

Если вы выполните print_r своего массива, вы увидите, как выглядит макет:

stdClass Object
(
  [addresses] => stdClass Object
    (
      [address] => Array
        (
          [0] => stdClass Object
            (
              [@array] => true
              [@id] => 888888
              [@uri] => xyz
              [household] => stdClass Object
                (
                  [@id] => 44444
                  [@uri] => xyz
                )

              [person] => stdClass Object
                (
                  [@id] => 
                  [@uri] => 
                )

              [addressType] => stdClass Object
                (
                  [@id] => 1
                  [@uri] => xyz
                  [name] => Primary
                )

              [address1] => xyz
              [address2] => 
              [address3] => 
              [city] => xyz
              [postalCode] => 111111
            )
        )
    )
)
0
ответ дан 18 December 2019 в 11:59
поделиться

Этот будет помещать все скалярные и нулевые значения в сеанс, где ключ не начинается с @

$jsonString = '{"addresses":{"address":[{"@array":"true","@id":"888888","@uri":"xyz","household":{"@id":"44444","@uri":"xyz"},"person":{"@id":"","@uri":""},"addressType":{"@id":"1","@uri":"xyz","name":"Primary"},"address1":"xyz","address2":null,"address3":null,"city":"xyz","postalCode":"111111"}]}}';

$result = json_decode($jsonString);

// will put *all* scalar and null values into session where key does not begin with a @
foreach($result->addresses->address[0] as $key=>$value) {
    if (substr($key, 0, 1) != '@'  && (is_scalar($value) || is_null($value)) ) {
        $_SESSION[$key] = $value;
    } 
}

print_r($_SESSION);

?>
0
ответ дан 18 December 2019 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: