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

7

我有一个类似于这样的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'];

谢谢!


你想要发生什么事情却没有发生?请始终描述你想要的行为和实际得到的行为。 - outis
在输出任何内容和引用 $_SESSION 之前,您是否调用了 session_start() 函数? - outis
1
这么多答案...但问题的点赞数却很少。 - womp
2
很多答案通常意味着问题简单,而不是“好”的问题。 - ceejayoz
对于一些人来说很容易,但对于另一些人来说却不是,因此才会有这个问题。 - pgtips
9个回答

10

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
)

3
为了以漂亮的形式显示结果,请在 print_r() 后添加 <pre> 标签。这个问题让我花费了很长时间才弄清楚! - Jefe
太棒了!!!非常感谢,这解决了我的问题。我忘了提到我使用了strstr,因为$addresses中包含了一些其他的头信息,需要将其剪切掉。但是这个方法解决了我的问题,我非常感激!!! - pgtips

3

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。


2
请注意,那些"@array"和"@id"字段是无效的JSON表示法,从技术上讲,它们会导致JSON解析器产生未指定的行为。

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

0

如果你使用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

json_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 @

0

This one will put all scalar and null values into session where key does not begin with a @

$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

也许尝试使用 $results['addresses']['address']['address1'];

不确定为什么要使用 strstr,但在这种情况下似乎不会改变任何东西。


0
你可以使用print_r输出$results,以便准确了解对象输出的样式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接