【问题标题】:How to decode a JSON string in PHP?如何在 PHP 中解码 JSON 字符串?
【发布时间】:2009-08-12 21:21:45
【问题描述】:

我有一个如下所示的 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 来解码这个并将 address1address2address3citypostalCode 放入会话变量中?

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

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

谢谢!

【问题讨论】:

  • 您希望发生的事情没有发生?总是描述你想要的行为和你得到的行为。
  • 在输出任何内容和引用 $_SESSION 之前,您是否致电 session_start()
  • 这么多的答案...这么少的问题upvotes。
  • 许多答案通常意味着简单的问题,而不是的问题。
  • 对某些人来说很容易,但对其他人来说很容易,因此是这个问题。

标签: php json


【解决方案1】:

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
)

【讨论】:

  • +1 要像显示的那样漂亮地打印结果,请在 print_r() 之后添加
     标记。这让我永远想通了!
  • 太棒了!!!!非常感谢,这个就搞定了。我没有提到我正在使用 strstr,因为我在 $addresses 中包含一些其他标头信息并且需要将其删除。但这完成了工作,我非常感激!!!
【解决方案2】:

json_decode 会将 json 格式的字符串解码为 PHP object

试试这个:

$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】:

    请注意,这些“@array”和“@id”字段是无效的 JSON 表示法,从技术上讲,它们会导致 JSON 解析器出现未指定的行为。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        也许可以试试 $results['addresses']['address']['address1'];

        不知道为什么要使用 strstr。但在这种情况下,它看起来不会改变任何东西。

        【讨论】:

          【解决方案6】:

          您可以使用 print_r 输出 $results 以准确找出对象输出的样子。

          【讨论】:

            【解决方案7】:

            如果你对你的数组进行 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
                        )
                    )
                )
            )
            

            【讨论】:

              【解决方案8】:

              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 @
              

              【讨论】:

                【解决方案9】:

                这会将所有标量和空值放入会话中,其中键不以@开头

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-08-27
                  • 2011-02-02
                  • 2018-06-28
                  • 2013-08-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-03-20
                  • 2019-07-26
                  相关资源
                  最近更新 更多