【问题标题】:How to decode a JSON String with several objects in PHP?如何在 PHP 中解码带有多个对象的 JSON 字符串?
【发布时间】:2011-02-03 08:14:57
【问题描述】:

在此示例How to decode a JSON String的帮助下,我知道如何使用一个对象解码 JSON 字符串

但现在我想用几个对象改进解码 JSON 字符串,但我不明白该怎么做。

这是一个例子:

{ "inbox": [
  { "firstName": "Brett", "lastName":"McLaughlin" },
  { "firstName": "Jason", "lastName":"Hunter" },
  { "firstName": "Elliotte", "lastName":"Harold" }
 ],
"sent": [
  { "firstName": "Isaac", "lastName": "Asimov" },
  { "firstName": "Tad", "lastName": "Williams" },
  { "firstName": "Frank", "lastName": "Peretti" }
 ],
"draft": [
  { "firstName": "Eric", "lastName": "Clapton" },
  { "firstName": "Sergei", "lastName": "Rachmaninoff" }
 ]
}
  1. 如何只用一个 foreach() 来 解码上面的 JSON 字符串?
  2. 如何检测对象的名称:收件箱, 在这个 foreach() 上发送或草稿?

【问题讨论】:

  • json_decode() 这应该会给你一个对象或数组的数组。你的问题是如何从这些数组中提取一些东西?
  • 我提供了上面我的问题的链接,他们展示了如何使用一个对象从 JSON 字符串中解码信息。现在我想知道如何用几个对象解码 JSON 字符串!其次,我想知道如何检测从哪个对象读取信息并将其显示在页面上,如下所示:对象:程序员名字:...姓氏:...对象:作者名字:.. .姓:...对象:音乐家名字:...姓:...
  • “现在我想知道如何用几个对象解码 JSON 字符串!” 我已经更新了我的答案来解决这个问题。基本上,您的示例中有 多个对象。和/或:你不能那样做。我的回答中的详细信息(stackoverflow.com/questions/2560096/…)。 HTH
  • 伙计们,我已经更正了我的问题!请帮忙!
  • 我现在明白这个问题了。您正在寻找foreach ($thing as $name => $value),请参阅我的新(est)答案。

标签: php object json


【解决方案1】:

新答案

关于您修改后的问题:foreach 实际上适用于属性以及多值项(数组),details here。因此,例如,在您的问题中使用 JSON 字符串:

$data = json_decode($json);
foreach ($data as $name => $value) {
    // This will loop three times:
    //     $name = inbox
    //     $name = sent
    //     $name = draft
    // ...with $value as the value of that property
}

在属性的主循环中,您可以使用内部循环遍历每个属性指向的数组条目。例如,如果您知道每个顶级属性都有一个数组值,并且每个数组条目都有一个“firstName”属性,那么这段代码:

$data = json_decode($json);
foreach ($data as $name => $value) {
    echo $name . ':'
    foreach ($value as $entry) {
        echo '  ' . $entry->firstName;
    }
}

...将显示:

收件箱:
  布雷特
  杰森
  艾略特
发送:
  伊萨克
  泰德
  坦率
草案:
  埃里克
  谢尔盖

旧答案

开始编辑 回复您的评论:

现在我想知道如何用多个对象解码 JSON 字符串!

您发布的示例确实有多个对象,它们都包含在一个包装对象中。这是JSON的要求;你不能(例如)这样做:

{"name": "I'm the first object"},
{"name": "I'm the second object"}

该 JSON 无效。 必须有一个顶级对象。它可能只包含一个数组:

{"objects": [
    {"name": "I'm the first object"},
    {"name": "I'm the second object"}
]}

...当然,您也可以为各个对象命名:

{
    "obj0": {"name": "I'm the first object"},
    "obj1": {"name": "I'm the second object"}
}

结束编辑

您的示例是一个包含三个属性的对象,每个属性的值都是一组对象。实际上,它与您链接的问题中的示例没有太大区别(它也有一个具有数组值属性的对象)。

所以:

$data = json_decode($json);
foreach ($data->programmers as $programmer) {
    // ...use $programmer for something...
}
foreach ($data->authors as $author) {
    // ...use $author for something...
}
foreach ($data->musicians as $musician) {
    // ...use $musician for something...
}

【讨论】:

  • 嗯,我想我在我的问题上给出了一个错误的例子。好的,接下来我真正想做的是:我有带有对象的 JSON 字符串:收件箱、已发送和草稿消息在数组上。在使用 foreach() 解码 JSON 字符串时,我将解码后的信息存储到 MySQL 数据库中。而且我必须知道对象名称才能使用字段“文件夹”将其存储在数据库中。我只有一个 foreach() 可以用收件箱、发送和草稿消息解码整个 JSON 字符串。现在清楚我想要做什么了吗? :-)
  • 谢谢你,T.J.克劳德!现在我已经得到了那个问题的答案。 ;-)
【解决方案2】:

您可以使用 json_decode 函数来解码 JSON 字符串:

$json = <<<JSON
{ "programmers": [
  { "firstName": "Brett", "lastName":"McLaughlin" },
  { "firstName": "Jason", "lastName":"Hunter" },
  { "firstName": "Elliotte", "lastName":"Harold" }
 ],
"authors": [
  { "firstName": "Isaac", "lastName": "Asimov" },
  { "firstName": "Tad", "lastName": "Williams" },
  { "firstName": "Frank", "lastName": "Peretti" }
 ],
"musicians": [
  { "firstName": "Eric", "lastName": "Clapton" },
  { "firstName": "Sergei", "lastName": "Rachmaninoff" }
 ]
}
JSON;

$data = json_decode($json);


然后,要查看数据的样子,您可以转储它:

var_dump($data);


你会看到你有一个包含三个数组的对象,每个数组都包含其他子对象:

object(stdClass)[1]
  public 'programmers' => 
    array
      0 => 
        object(stdClass)[2]
          public 'firstName' => string 'Brett' (length=5)
          public 'lastName' => string 'McLaughlin' (length=10)
      1 => 
        object(stdClass)[3]
          public 'firstName' => string 'Jason' (length=5)
          public 'lastName' => string 'Hunter' (length=6)
      ...
  public 'authors' => 
    array
      0 => 
        object(stdClass)[5]
          public 'firstName' => string 'Isaac' (length=5)
          public 'lastName' => string 'Asimov' (length=6)
      ...

这意味着您知道如何访问您的数据。


例如,要显示程序员列表,您可以使用:

foreach ($data->programmers as $programmer) {
  echo $programmer->firstName . ' ' . $programmer->lastName . '<br />';
}


这将为您提供以下输出:

Brett McLaughlin
Jason Hunter
Elliotte Harold

【讨论】:

  • 嗯,我想我在我的问题上给出了一个错误的例子。好的,接下来我真正想做的是:我有带有对象的 JSON 字符串:收件箱、已发送和草稿数组上的消息。在使用 foreach() 解码 JSON 字符串时,我将解码后的信息存储到 MySQL 数据库中。而且我必须知道对象名称才能使用字段“文件夹”将其存储在数据库中。我只有一个 foreach() 可以用收件箱、发送和草稿消息解码整个 JSON 字符串。现在清楚我想要做什么了吗? :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2012-03-25
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多