【问题标题】:json decode in phpphp中的json解码
【发布时间】:2009-08-13 04:22:16
【问题描述】:

我有以下 json 字符串,我只想从中检索电子邮件地址。在php中怎么做?

{"communications":{"communication":[{"@array":"true","@id":"23101384","@uri":"xyz/v1/Communications/1111","household":{"@id":"111111","@uri":"xyz/v1/Households/5465465"},"person":{"@id":"","@uri":""},"communicationType":{"@id":"1","@uri":"xyz/v1/Communications/CommunicationTypes/1","name":"Home Phone"},"communicationGeneralType":"Telephone","communicationValue":"1111","searchCommunicationValue":"2693240758","listed":"true","communicationComment":null,"createdDate":"2008-11-10T12:31:26","lastUpdatedDate":"2009-08-11T23:40:02"},{"@array":"true","@id":"11111","@uri":"xyz/v1/Communications/111111111","household":{"@id":"14436295","@uri":"xyz/v1/Households/11111"},"person":{"@id":"2222222","@uri":"xyz/v1/People/22222222"},"communicationType":{"@id":"2","@uri":"xyz/v1/Communications/CommunicationTypes/2","name":"Work Phone"},"communicationGeneralType":"Telephone","communicationValue":"11111","searchCommunicationValue":"789787987","listed":"false","communicationComment":null,"createdDate":"2009-08-09T15:49:27","lastUpdatedDate":"2009-08-11T23:40:02"},{"@array":"true","@id":"11111","@uri":"xyz/v1/Communications/11111","household":{"@id":"1111","@uri":"xyz/v1/Households/1111"},"person":{"@id":"244404","@uri":"xyz/v1/People/1111"},"communicationType":{"@id":"3","@uri":"xyz/v1/Communications/CommunicationTypes/3","name":"Mobile"},"communicationGeneralType":"Telephone","communicationValue":"22222","searchCommunicationValue":"5475454","listed":"true","communicationComment":null,"createdDate":"2008-11-10T12:31:26","lastUpdatedDate":"2009-08-11T23:40:02"},{"@array":"true","@id":"15454","@uri":"xyz/v1/Communications/111111","household":{"@id":"14436295","@uri":"xyz/v1/Households/1111"},"person":{"@id":"244444474","@uri":"xyz/v1/People/111111"},"communicationType":{"@id":"4","@uri":"xyz/v1/Communications/CommunicationTypes/4","name":"Email"},"communicationGeneralType":"Email","communicationValue":"email@needthis.com","searchCommunicationValue":"email@needthis.com","listed":"true","communicationComment":null,"createdDate":"2008-11-10T12:31:26","lastUpdatedDate":"2009-08-11T23:39:06"}]}}

【问题讨论】:

标签: php json


【解决方案1】:

考虑到你有json_decoded 你这样的数据:

$data = json_decode($json);

你可以使用var_dump (好吧,如果与Xdebug 扩展一起使用,它的输出看起来会更好,顺便说一句,这在开发机器上很不错)数据:

// Allows you to know what's in the data ;-)
var_dump($data);

你会得到这样的东西:

object(stdClass)[1]
  public 'communications' => 
    object(stdClass)[2]
      public 'communication' => 
        array
          0 => 
            object(stdClass)[3]
              public '@array' => string 'true' (length=4)
              public '@id' => string '23101384' (length=8)
              public '@uri' => string 'xyz/v1/Communications/1111' (length=26)
              public 'household' => 
                object(stdClass)[4]
                  public '@id' => string '111111' (length=6)
                  public '@uri' => string 'xyz/v1/Households/5465465' (length=25)
              public 'person' => 
                object(stdClass)[5]
                  public '@id' => string '' (length=0)
                  public '@uri' => string '' (length=0)
              public 'communicationType' => 
                object(stdClass)[6]
                  public '@id' => string '1' (length=1)
                  public '@uri' => string 'xyz/v1/Communications/CommunicationTypes/1' (length=42)
                  public 'name' => string 'Home Phone' (length=10)
              public 'communicationGeneralType' => string 'Telephone' (length=9)
              public 'communicationValue' => string '1111' (length=4)
              public 'searchCommunicationValue' => string '2693240758' (length=10)
              public 'listed' => string 'true' (length=4)
              public 'communicationComment' => null
              public 'createdDate' => string '2008-11-10T12:31:26' (length=19)
              public 'lastUpdatedDate' => string '2009-08-11T23:40:02' (length=19)
          1 => 
            object(stdClass)[7]
              public '@array' => string 'true' (length=4)
              public '@id' => string '11111' (length=5)
              public '@uri' => string 'xyz/v1/Communications/111111111' (length=31)
              public 'household' => 
                object(stdClass)[8]
                  public '@id' => string '14436295' (length=8)
                  public '@uri' => string 'xyz/v1/Households/11111' (length=23)
              public 'person' => 
                object(stdClass)[9]
                  public '@id' => string '2222222' (length=7)
                  public '@uri' => string 'xyz/v1/People/22222222' (length=22)
              public 'communicationType' => 
                object(stdClass)[10]
                  public '@id' => string '2' (length=1)
                  public '@uri' => string 'xyz/v1/Communications/CommunicationTypes/2' (length=42)
                  public 'name' => string 'Work Phone' (length=10)
              public 'communicationGeneralType' => string 'Telephone' (length=9)
              public 'communicationValue' => string '11111' (length=5)
              public 'searchCommunicationValue' => string '789787987' (length=9)
              public 'listed' => string 'false' (length=5)
              public 'communicationComment' => null
              public 'createdDate' => string '2009-08-09T15:49:27' (length=19)
              public 'lastUpdatedDate' => string '2009-08-11T23:40:02' (length=19)
          2 => 
            object(stdClass)[11]
              public '@array' => string 'true' (length=4)
              public '@id' => string '11111' (length=5)
              public '@uri' => string 'xyz/v1/Communications/11111' (length=27)
              public 'household' => 
                object(stdClass)[12]
                  public '@id' => string '1111' (length=4)
                  public '@uri' => string 'xyz/v1/Households/1111' (length=22)
              public 'person' => 
                object(stdClass)[13]
                  public '@id' => string '244404' (length=6)
                  public '@uri' => string 'xyz/v1/People/1111' (length=18)
              public 'communicationType' => 
                object(stdClass)[14]
                  public '@id' => string '3' (length=1)
                  public '@uri' => string 'xyz/v1/Communications/CommunicationTypes/3' (length=42)
                  public 'name' => string 'Mobile' (length=6)
              public 'communicationGeneralType' => string 'Telephone' (length=9)
              public 'communicationValue' => string '22222' (length=5)
              public 'searchCommunicationValue' => string '5475454' (length=7)
              public 'listed' => string 'true' (length=4)
              public 'communicationComment' => null
              public 'createdDate' => string '2008-11-10T12:31:26' (length=19)
              public 'lastUpdatedDate' => string '2009-08-11T23:40:02' (length=19)
          3 => 
            object(stdClass)[15]
              public '@array' => string 'true' (length=4)
              public '@id' => string '15454' (length=5)
              public '@uri' => string 'xyz/v1/Communications/111111' (length=28)
              public 'household' => 
                object(stdClass)[16]
                  public '@id' => string '14436295' (length=8)
                  public '@uri' => string 'xyz/v1/Households/1111' (length=22)
              public 'person' => 
                object(stdClass)[17]
                  public '@id' => string '244444474' (length=9)
                  public '@uri' => string 'xyz/v1/People/111111' (length=20)
              public 'communicationType' => 
                object(stdClass)[18]
                  public '@id' => string '4' (length=1)
                  public '@uri' => string 'xyz/v1/Communications/CommunicationTypes/4' (length=42)
                  public 'name' => string 'Email' (length=5)
              public 'communicationGeneralType' => string 'Email' (length=5)
              public 'communicationValue' => string 'email@needthis.com' (length=18)
              public 'searchCommunicationValue' => string 'email@needthis.com' (length=18)
              public 'listed' => string 'true' (length=4)
              public 'communicationComment' => null
              public 'createdDate' => string '2008-11-10T12:31:26' (length=19)
              public 'lastUpdatedDate' => string '2009-08-11T23:39:06' (length=19)

这意味着您应该能够通过以下方式访问您正在寻找的数据:

foreach ($data->communications->communication as $communication) {
    if ($communication->communicationGeneralType == 'Email') {
        var_dump($communication->communicationValue);
        var_dump($communication->searchCommunicationValue);
    }
}

这会得到你:

string 'email@needthis.com' (length=18)
string 'email@needthis.com' (length=18)

communications”是一个对象,其中包含“communication”,它是一个对象数组,每个对象都包含一个communicationGeneralType,可以让你判断当前通信是否为EMail。

如果是,您可以使用communicationValuesearchCommunicationValue 字段。

如果不遍历每个 communication 元素,我真的看不到这样做的方法...

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    另一个关于访问它是多么惰性的转折:

    $json_object = '{"communications":
                           {"communication":
                             [{"@array":"true","@id":"23101384","@uri":"xyz/v1/Communications/1111","household":
                                {"@id":"111111","@uri":"xyz/v1/Households/5465465"},
                                "person": {"@id":"","@uri":""},
                                "communicationType":{"@id":"1","@uri":"xyz/v1/Communications/CommunicationTypes/1","name":"Home Phone"},
                                "communicationGeneralType":"Telephone","communicationValue":"1111","searchCommunicationValue":"2693240758",
                                   "listed":"true","communicationComment":null,"createdDate":"2008-11-10T12:31:26","lastUpdatedDate":"2009-08-11T23:40:02"},
                                {"@array":"true","@id":"11111","@uri":"xyz/v1/Communications/111111111","household":
                                  {"@id":"14436295","@uri":"xyz/v1/Households/11111"},
                                "person": {"@id":"2222222","@uri":"xyz/v1/People/22222222"},
                                "communicationType": {"@id":"2","@uri":"xyz/v1/Communications/CommunicationTypes/2","name":"Work Phone"},
                                "communicationGeneralType":"Telephone","communicationValue":"11111","searchCommunicationValue":"789787987","listed":"false",
                                    "communicationComment":null,"createdDate":"2009-08-09T15:49:27","lastUpdatedDate":"2009-08-11T23:40:02"},
                                {"@array":"true","@id":"11111","@uri":"xyz/v1/Communications/11111","household": {"@id":"1111","@uri":"xyz/v1/Households/1111"},
                                "person":{"@id":"244404","@uri":"xyz/v1/People/1111"},
                                "communicationType":{"@id":"3","@uri":"xyz/v1/Communications/CommunicationTypes/3","name":"Mobile"},
                                "communicationGeneralType":"Telephone","communicationValue":"22222","searchCommunicationValue":"5475454","listed":"true",
                                    "communicationComment":null,"createdDate":"2008-11-10T12:31:26","lastUpdatedDate":"2009-08-11T23:40:02"},
                                {"@array":"true","@id":"15454","@uri":"xyz/v1/Communications/111111","household":{"@id":"14436295","@uri":"xyz/v1/Households/1111"},
                                "person":{"@id":"244444474","@uri":"xyz/v1/People/111111"},
                                "communicationType":{"@id":"4","@uri":"xyz/v1/Communications/CommunicationTypes/4","name":"Email"},
                                "communicationGeneralType":"Email","communicationValue":"email@needthis.com","searchCommunicationValue":"email@needthis.com","listed":"true",
                                "communicationComment":null,"createdDate":"2008-11-10T12:31:26","lastUpdatedDate":"2009-08-11T23:39:06"}
                             ]
                           }
                          }';
    
    
        $json_decoded = json_decode($json_object);
        echo "email: ".$json_decoded->communications->communication[3]->communicationValue."<br />";
    

    【讨论】:

    • 这太棒了!它完美地完成了这项工作。谢谢!
    【解决方案3】:

    您可以使用json_decode()。你的示例字符串让我现在想起来有点复杂,但作为我自己的一个例子:

    $json = '{"a":"apples","b":["bananas","boysenberries"],"c":"carrots"}';
    
    $arr = json_decode($json);
    echo $arr['a']; // "apples"
    echo $arr['b'][0]; // "bananas"
    

    【讨论】:

    • 是的,这就是我想要的,但我不知道具体细节?非常感谢任何帮助。
    • 电子邮件地址的数组名称和密钥是什么?
    • 使用var_dumpprint_r 打印输出并查看那里
    【解决方案4】:
    <?php
    $string = '{"communications":{"communication":[{"@array":"true","@id":"23101384","@uri":"xyz/v1/Communications/1111","household":{"@id":"111111","@uri":"xyz/v1/Households/5465465"},"person":{"@id":"","@uri":""},"communicationType":{"@id":"1","@uri":"xyz/v1/Communications/CommunicationTypes/1","name":"Home Phone"},"communicationGeneralType":"Telephone","communicationValue":"1111","searchCommunicationValue":"2693240758","listed":"true","communicationComment":null,"createdDate":"2008-11-10T12:31:26","lastUpdatedDate":"2009-08-11T23:40:02"},{"@array":"true","@id":"11111","@uri":"xyz/v1/Communications/111111111","household":{"@id":"14436295","@uri":"xyz/v1/Households/11111"},"person":{"@id":"2222222","@uri":"xyz/v1/People/22222222"},"communicationType":{"@id":"2","@uri":"xyz/v1/Communications/CommunicationTypes/2","name":"Work Phone"},"communicationGeneralType":"Telephone","communicationValue":"11111","searchCommunicationValue":"789787987","listed":"false","communicationComment":null,"createdDate":"2009-08-09T15:49:27","lastUpdatedDate":"2009-08-11T23:40:02"},{"@array":"true","@id":"11111","@uri":"xyz/v1/Communications/11111","household":{"@id":"1111","@uri":"xyz/v1/Households/1111"},"person":{"@id":"244404","@uri":"xyz/v1/People/1111"},"communicationType":{"@id":"3","@uri":"xyz/v1/Communications/CommunicationTypes/3","name":"Mobile"},"communicationGeneralType":"Telephone","communicationValue":"22222","searchCommunicationValue":"5475454","listed":"true","communicationComment":null,"createdDate":"2008-11-10T12:31:26","lastUpdatedDate":"2009-08-11T23:40:02"},{"@array":"true","@id":"15454","@uri":"xyz/v1/Communications/111111","household":{"@id":"14436295","@uri":"xyz/v1/Households/1111"},"person":{"@id":"244444474","@uri":"xyz/v1/People/111111"},"communicationType":{"@id":"4","@uri":"xyz/v1/Communications/CommunicationTypes/4","name":"Email"},"communicationGeneralType":"Email","communicationValue":"email@needthis.com","searchCommunicationValue":"email@needthis.com","listed":"true","communicationComment":null,"createdDate":"2008-11-10T12:31:26","lastUpdatedDate":"2009-08-11T23:39:06"}]}}';
    
    $encoded = json_decode($string, JSON_FORCE_OBJECT);
    
    echo $encoded['communications']['communication'][3]['communicationValue'];
    
    echo "\n";
    
    echo $encoded['communications']['communication'][3]['searchCommunicationValue'];
    
    ?>
    

    但如果communicationValuesearchCommunicationValue 超出communication 的索引3,你就有麻烦了。您可能需要循环 communication 并在其键/值上搜索这些字符串。

    【讨论】:

      【解决方案5】:

      我写的很好的例子

      在函数中传递 json_object 和 1,您将看到所有结构的值。

      function decodejson($value,$num){
          if (count($value,0) > 0 && is_array($value)){
              foreach ($value as $key =>$tvalue){
                  if (is_array($tvalue)){
                      //echo $key."-<br />";
                      $num++;
                      decodejson($tvalue,$num);
                  }else
                      echo str_repeat("&nbsp;", $num).$key."->".$tvalue."<br />";
              }
          }else
              echo str_repeat("&nbsp;", $num).$key."->".$value."<br />";
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-26
        • 2013-11-05
        • 2011-09-10
        • 2013-09-03
        • 1970-01-01
        • 2017-05-31
        • 2023-03-07
        • 2012-08-18
        相关资源
        最近更新 更多