PHP在不循环整个json对象的情况下检索json值


PHP retrieve json values without loop through the whole json object

我是PHP领域的新手,所以请耐心回答我的问题。

基本上,我有/将有一个相当大的json文件,我需要查询该文件以获得基于所提供密钥的单个条目。一个例子如下:

{
"key1" : {value1},
"key2" : {value2},
...,
"keyn" : {valuen}
}

我只需要在任何一个请求中检索一个值,并希望获得更好的性能。

根据我的搜索,在PHP中处理这种处理的基本方法是使用json_decode(),然后使用foreach

然而,这种方法似乎需要根据密钥的顺序和我要查找的密钥来遍历整个文件。所以,如果我在寻找凯恩斯,那么基本上我必须从大文件的顶部到底部阅读。(是的,我可以使用一些排序算法来获得更好的结果)

但据我所知,JSON基本上是HashMap的另一种形式,所以给定HashMap可以轻松快速地get,PhP中是否有类似的方法可以从中获得最佳性能?

好吧,考虑到您提供的结构,您绝对不需要遍历整个对象。

如果你正在寻找keyn,你只需要做:

$obj = json_decode($input);
echo $obj->keyn;

也许我错过了一些显而易见的东西。如果你想防止必须对整个对象进行json_decode,那么你的问题更有意义。。。但这不是你要问的。

来自JSON.org

JSON建立在两个结构上:

名称/值对的集合。在各种语言中,这被实现为对象、>记录、结构、字典、哈希表、键控列表或关联数组。值的有序列表。在大多数语言中,这是以数组、向量、列表或>序列的形式实现的。

如果不首先使用json_decode()将json转换为可用对象,就不能仅与json交互。但是,如果您知道关键点,那么在运行json_decode()之后,您可以与它交互(因为它现在是一个对象)。例如:

<?php
$string = '{"foo": "bar", "cool": "attr"}';
$result = json_decode($string);
// Result: object(stdClass)#1 (2) { ["foo"]=> string(3) "bar" ["cool"]=> string(4) "attr" }
var_dump($result);
// Prints "bar"
echo $result->foo;
// Prints "attr"
echo $result->cool;
?>

在这种情况下,var_dump()print_r()是你的朋友。

没有任何神奇的方法可以在不使用任何循环的情况下找到值

我还没有对此进行基准测试:

这就是我在不必完成对整棵树的迭代的情况下处理问题的方法,如果和何时匹配是

$key = 'keyn'
$obj = json_decode(file_get_contents('path/to/your/file'), true);
$len = count($obj);
$match = false;
for($ii = 0; $ii < $len; $ii++){
   $curr = $obj[$ii];
   if($curr == $key) {
     $match = $curr;
   }
   break;
}

在PHP中,您可以使用函数file_get_contents来解析JSON文件。您必须遍历每一个键值对。