如何用php从json中提取数据?

wkyowqbh  于 2021-06-15  发布在  Mysql
关注(0)|答案(6)|浏览(352)

这是一个通用的参考问题和答案,涵盖了许多永无止境的“如何访问json中的数据?”问题。这里介绍了在php中解码json和访问结果的基本知识。
我有json:

{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}

如何在php中解码并访问结果数据?

plicqrtu

plicqrtu1#

简介

首先你有一根绳子。json不是数组、对象或数据结构。json是一种基于文本的序列化格式,所以它是一个奇特的字符串,但仍然只是一个字符串。在php中使用 json_decode() .

$data = json_decode($json);

你可能会发现:
标量:字符串、int、float和bools
空值(它自己的一种特殊类型)
复合类型:对象和数组。
这些东西可以用json编码。或者更准确地说,这些是可以用json编码的东西的php版本。
他们没什么特别的。它们不是“json对象”或“json数组”,你已经解码了json,现在你有了基本的日常php类型。
对象将是stdclass的示例,这是一个内置类,它只是一个泛型,在这里并不重要。

访问对象属性

访问其中一个对象的属性的方式与访问任何其他对象的公共非静态属性的方式相同,例如。 $object->property .

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut

访问数组元素

您可以像访问任何其他数组一样访问其中一个数组的元素,例如。 $array[0] .

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

在它上面迭代 foreach .

foreach ($toppings as $topping) {
    echo $topping, "\n";
}

光滑的
巧克力加糖
枫树
或者乱搞任何一个内置的数组函数。

访问嵌套项

对象的属性和数组的元素可能是更多的对象和/或数组-您可以像往常一样继续访问它们的属性和成员,例如。 $object->array[0]->etc .

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

echo $yummy->toppings[2]->id; //5004

将true作为第二个参数传递给json\u decode()

当您这样做时,您将得到关联数组,而不是对象-带有键字符串的数组。同样,您可以像往常一样访问其中的元素,例如。 $array['key'] .

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json, true);

echo $yummy['toppings'][2]['type']; //Maple

访问关联数组项

将json对象解码为关联php数组时,可以使用 foreach (array_expression as $key => $value) 语法,例如

$json = '
{
    "foo": "foo value",
    "bar": "bar value",
    "baz": "baz value"
}';

$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
    echo "The value of key '$key' is '$value'", PHP_EOL;
}

印刷品
键'foo'的值是'foo value'
键“bar”的值为“bar value”
“baz”键的值为“baz value”

不知道数据是如何组织的

阅读文档以了解json的来源。
看看json,你会看到大括号 {} 应该是一个对象,在这里你可以看到方括号 [] 需要一个数组。
用一个 print_r() :

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

print_r($yummy);

并检查输出:

stdClass Object
(
    [type] => donut
    [name] => Cake
    [toppings] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 5002
                    [type] => Glazed
                )

            [1] => stdClass Object
                (
                    [id] => 5006
                    [type] => Chocolate with Sprinkles
                )

            [2] => stdClass Object
                (
                    [id] => 5004
                    [type] => Maple
                )

        )

)

它将告诉您在哪里有对象,在哪里有数组,以及它们的成员的名称和值。
如果你在迷路之前只能走那么远,那就走那么远,用你的手去打它 print_r() :

print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

在这个方便的交互式json浏览器中查看一下。
把问题分解成更容易理解的部分。

json\u decode()返回null

这是因为:
json完全由这些组成, null .
json无效-请检查 json_last_error_msg 或者通过jsonlint之类的东西。
它包含嵌套深度超过512层的元素。可以通过将整数作为第三个参数传递给 json_decode() .
如果你需要改变最大深度,你可能解决了错误的问题。找出为什么会得到如此深度嵌套的数据(例如,正在查询的生成json的服务有一个bug),并避免这种情况发生。

对象属性名称包含特殊字符

有时您会有一个对象属性名,其中包含类似连字符的内容 - 或在标志处 @ 不能在文本标识符中使用。相反,您可以在大括号中使用字符串文字来处理它。

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

如果您有一个整数作为属性,请参阅:如何访问具有整数等名称的对象属性?作为参考。

有人把json放在你的json里了

这是荒谬的,但它发生了-有json编码为字符串在您的json。解码,像往常一样访问字符串,解码,最终得到你需要的。

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed

数据无法放入内存

如果你的json太大了 json_decode() 马上处理事情开始变得棘手。请参见:
用php处理大型json文件
如何正确地遍历一个大的json文件

如何排序

请参阅:reference:php中排序数组和数据的所有基本方法。

3okqufwl

3okqufwl2#

可以使用json_decode()将json字符串转换为php对象/数组。
如。
输入:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

输出:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

需要记住的几点: json_decode 要求字符串是有效的 json 否则它会回来的 NULL .
如果解码失败, json_last_error() 可用于确定错误的确切性质。
一定要进去 utf8 内容,或 json_decode 可能会出错并返回 NULL 价值观。

vd2z7a6w

vd2z7a6w3#

考虑使用 JSONPath https://packagist.org/packages/flow/jsonpath
对于如何使用它和解析json文件有一个非常清晰的解释,避免了所有提出的循环。如果你熟悉 XPath 为了 XML 你会开始喜欢这种方法的。

cx6n0qe3

cx6n0qe34#

https://paiza.io/projects/x1qjjbka8mdo6ovh-j_63w
检查下面的代码,以便在中将json转换为数组 PHP ,如果json是正确的 json_decode() 工作正常,并将返回一个数组,但如果json格式不正确,则返回 NULL ,

<?php
function jsonDecode1($json){
    $arr = json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );

如果json格式不正确,并且只需要数组,则可以使用此函数,

<?php
function jsonDecode2($json){
    $arr = (array) json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );

如果json格式不正确,您希望停止代码执行,那么可以使用此函数,

<?php
function jsonDecode3($json){
    $arr = (array) json_decode($json, true);

    if(empty(json_last_error())){
        return $arr;
    }
    else{
        throw new ErrorException( json_last_error_msg() );
    }
}

// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );

你可以根据需要使用任何功能,

ohfgkhjo

ohfgkhjo5#

// Using json as php array 

$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';

//or use from file
//$json = file_get_contents('results.json');

$someArray = json_decode($json, true);

foreach ($someArray as $key => $value) {
    echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}
sz81bmfz

sz81bmfz6#

我们可以使用php中的json解码函数将json字符串解码成数组
1) json\u decode($json\u string)//返回object
2) json\u decode($json\u string,true)//返回数组

$json_string = '{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';
$array = json_decode($json_string,true);

echo $array['type']; //it gives donut

相关问题