一尘不染

如何用PHP中的几个对象解码JSON字符串?

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()上的收件箱,已发送或草稿?

阅读 234

收藏
2020-07-27

共1个答案

一尘不染

新答案

重新修改后的问题:foreach实际上适用于属性以及多值项(数组),请参见此处。例如,在您的问题中包含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...
}
2020-07-27