Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中解码JSON字符串?_Php_Json - Fatal编程技术网

如何在PHP中解码JSON字符串?

如何在PHP中解码JSON字符串?,php,json,Php,Json,我有一个JSON字符串,如下所示: {"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,"a

我有一个JSON字符串,如下所示:

{"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"}]}}
什么是PHP来解码它并将
address1
address2
address3
city
postalCode
放入会话变量

到目前为止,我试过这个,但不起作用:

$results = json_decode(strstr($address, '{"addresses":{"address":[{'), true);
$_SESSION['address1'] = $results['address']['address1'];

谢谢

可以尝试$results['address']['address']['address1']


不知道为什么要使用strstr。但是在这个例子中,它看起来不会改变任何东西。

您可以使用print\r输出$results,以准确了解对象输出的外观。

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

如果您打印了阵列,您可以看到布局是如何的:

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

为什么不解码整个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'];
将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。

JSON\u decode($jsonData)返回一个对象,而不是数组

例如:

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 @
请注意,这些“@array”和“@id”字段是无效的JSON符号,从技术上讲,它们会导致JSON解析器中出现未指定的行为。

此字段将把所有标量值和空值放入会话中,其中键不以@
$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);

?>

什么事情没有发生,而你却想发生?始终描述您想要的行为和您得到的行为。在输出任何内容和引用$会话之前,您是否调用了
session\u start()
。。。如此少的问题向上投票。许多答案通常意味着简单的问题,而不是好的问题。对某些人来说简单,但对其他人来说不好,因此是问题。+1要按照显示的方式打印结果,请在print_r()后添加标记。这件事我花了很长时间才弄明白!令人惊叹的!!!!非常感谢,这次成功了。我选择提到我正在使用strstr,因为我在$addresses中包含了一些其他头信息,需要将其切掉。但这确实起到了作用,我非常感激!!!
$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);

?>