如何用PHP解析JSON文件?

Joh*_*Doe 386 php json

我试图使用PHP解析JSON文件.但我现在被困住了.

这是我的JSON文件的内容:

{
    "John": {
        "status":"Wait"
    },
    "Jennifer": {
        "status":"Active"
    },
    "James": {
        "status":"Active",
        "age":56,
        "count":10,
        "progress":0.0029857,
        "bad":0
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所尝试的:

<?php

$string = file_get_contents("/home/michael/test.json");
$json_a = json_decode($string, true);

echo $json_a['John'][status];
echo $json_a['Jennifer'][status];
Run Code Online (Sandbox Code Playgroud)

但是,因为我不知道的名字(例如'John','Jennifer')和所有可用键和值(如'age','count')事前,我想我需要创建一些foreach循环.

我会很感激这样的例子.

Gor*_*don 318

要迭代多维数组,可以使用RecursiveArrayIterator

$jsonIterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($json, TRUE)),
    RecursiveIteratorIterator::SELF_FIRST);

foreach ($jsonIterator as $key => $val) {
    if(is_array($val)) {
        echo "$key:\n";
    } else {
        echo "$key => $val\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

John:
status => Wait
Jennifer:
status => Active
James:
status => Active
age => 56
count => 10
progress => 0.0029857
bad => 0
Run Code Online (Sandbox Code Playgroud)

在键盘上运行

  • @Álvaro显然.使用foreach,您只能递归一个深度.使用上述方法,您可以在多级数组上进行递归.另外,整个事情都是用OOP封装的,所以你可以更好地重用,你可以在UnitTests中轻松地模拟它,你可以将Iterators与其他迭代器一起做不同的事情,比如限制,缓存,过滤等等.除此之外您可能想要创建的自定义迭代器. (12认同)
  • 这种方法是否提供了优于旧的foreach的任何特殊优势? (10认同)

Bol*_*ock 113

我不敢相信很多人在没有正确阅读JSON的情况下发布答案.

如果$json_a单独使用迭代,则会有一个对象对象.即使您true作为第二个参数传入,也有一个二维数组.如果你在第一个维度上循环,你就不能像这样回应第二个维度.所以这是错的:

foreach ($json_a as $k => $v) {
   echo $k, ' : ', $v;
}
Run Code Online (Sandbox Code Playgroud)

要回应每个人的状态,请尝试以下方法:

<?php

$string = file_get_contents("/home/michael/test.json");
if ($string === false) {
    // deal with error...
}

$json_a = json_decode($string, true);
if ($json_a === null) {
    // deal with error...
}

foreach ($json_a as $person_name => $person_a) {
    echo $person_a['status'];
}

?>
Run Code Online (Sandbox Code Playgroud)

  • 如果php和json文件在同一个dir中,我们可以用`file_get_contents("test.json")读取json;`(不需要放路径). (5认同)
  • @Chetabahana 这实际上是不正确的。如果您使用像“test.json”这样的相对路径,那么该路径将相对于当前目录进行计算,而不一定是 PHP 脚本所在的位置。在 bash 上,您可以通过输入“pwd”来发现当前目录。 (2认同)

swi*_*ift 46

最优雅的解决方案:

$shipments = json_decode(file_get_contents("shipments.js"), true);
print_r($shipments);
Run Code Online (Sandbox Code Playgroud)

请记住,json文件必须以UTF-8编码而不使用BOM.如果文件有BOM,则json_decode将返回NULL.

或者:

$shipments = json_encode(json_decode(file_get_contents("shipments.js"), true));
echo $shipments;
Run Code Online (Sandbox Code Playgroud)

  • BOM =字节顺序标记. (5认同)
  • 非常棒,但整个物料清单(BOM)让我完全糊涂了.呃......你在说什么?我是唯一一个对使用神秘的无法解释的缩写而烦恼的人吗?好的,请使用缩写,但请说明首次使用时(WFU)...谢谢. (3认同)
  • 如果你对Mac和PC JSON的工作,因为他们使用不同的默认的文本格式http://en.wikipedia.org/wiki/Byte_order_mark典型的疑难杂症. (3认同)

Tha*_*ama 17

尝试

<?php
$string = file_get_contents("/home/michael/test.json");
$json_a=json_decode($string,true);

foreach ($json_a as $key => $value){
  echo  $key . ':' . $value;
}
?>
Run Code Online (Sandbox Code Playgroud)

  • _Try This_答案在StackOverflow上的价值很低,因为它们对教育OP和未来研究人员的作用很小。如果您要在页面上留下此答案,请说明您的答案如何工作以及为什么建议这样做。 (4认同)

Dav*_*vid 16

没有人指出你开始的"标签"是错误的,完全超出我的范围.您正在使用{}创建对象,而可以使用[]创建数组.

[ // <-- Note that I changed this
    {
        "name" : "john", // And moved the name here.
        "status":"Wait"
    },
    {
        "name" : "Jennifer",
        "status":"Active"
    },
    {
        "name" : "James",
        "status":"Active",
        "age":56,
        "count":10,
        "progress":0.0029857,
        "bad":0
    }
] // <-- And this.
Run Code Online (Sandbox Code Playgroud)

通过此更改,json将被解析为数组而不是对象.使用该数组,您可以执行任何操作,例如循环等.


小智 16

试试这个

$json_data = '{
"John": {
    "status":"Wait"
},
"Jennifer": {
    "status":"Active"
},
"James": {
    "status":"Active",
    "age":56,
    "count":10,
    "progress":0.0029857,
    "bad":0
  }
 }';

 $decode_data = json_decode($json_data);
foreach($decode_data as $key=>$value){

        print_r($value);
}
Run Code Online (Sandbox Code Playgroud)

  • _Try This_答案在StackOverflow上价值很低,因为他们对OP和未来研究人员的教育很少.如果您要在页面上留下此答案,请说明您的答案是如何工作的以及为什么建议这样做. (3认同)

Ind*_*ngh 9

尝试:

$string = file_get_contents("/home/michael/test.json");
$json = json_decode($string, true);

foreach ($json as $key => $value) {
    if (!is_array($value)) {
        echo $key . '=>' . $value . '<br />';
    } else {
        foreach ($value as $key => $val) {
            echo $key . '=>' . $val . '<br />';
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • _Try This_ 答案在 StackOverflow 上的价值很低,因为它们对 OP 和未来的研究人员的教育作用很小。如果您打算在页面上留下这个答案,请解释您的答案是如何工作的以及为什么它是可取的。 (2认同)

Pri*_*tha 9

更标准的答案:

$jsondata = file_get_contents(PATH_TO_JSON_FILE."/jsonfile.json");

$array = json_decode($jsondata,true);

foreach($array as $k=>$val):
    echo '<b>Name: '.$k.'</b></br>';
    $keys = array_keys($val);
    foreach($keys as $key):
        echo '&nbsp;'.ucfirst($key).' = '.$val[$key].'</br>';
    endforeach;
endforeach;
Run Code Online (Sandbox Code Playgroud)

输出是:

Name: John
 Status = Wait
Name: Jennifer
 Status = Active
Name: James
 Status = Active
 Age = 56
 Count = 10
 Progress = 0.0029857
 Bad = 0
Run Code Online (Sandbox Code Playgroud)

  • 纯代码的答案在StackOverflow上价值不高,因为它们对教育OP和未来的研究人员几乎没有作用。如果您要在页面上留下此答案,请说明您的答案如何工作以及为什么建议这样做。 (2认同)

Ale*_*lex 8

循环遍历JSON,foreach循环为键值对.进行类型检查以确定是否需要进行更多循环.

foreach($json_a as $key => $value) {
    echo $key;
    if (gettype($value) == "object") {
        foreach ($value as $key => $value) {
          # and so on
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

<?php
$json = '{
    "response": {
        "data": [{"identifier": "Be Soft Drinker, Inc.", "entityName": "BusinessPartner"}],
        "status": 0,
        "totalRows": 83,
        "startRow": 0,
        "endRow": 82
    }
}';
$json = json_decode($json, true);
//echo '<pre>'; print_r($json); exit;
echo $json['response']['data'][0]['identifier'];
$json['response']['data'][0]['entityName']
echo $json['response']['status']; 
echo $json['response']['totalRows']; 
echo $json['response']['startRow']; 
echo $json['response']['endRow']; 

?>
Run Code Online (Sandbox Code Playgroud)

  • 纯代码的答案在StackOverflow上价值不高,因为它们对教育OP和未来的研究人员几乎没有作用。如果您要在页面上留下此答案,请说明您的答案如何工作以及为什么建议这样做。 (3认同)

归档时间:

查看次数:

721297 次

最近记录:

6 年 前