PHP从字符串文字访问嵌套对象的属性

时间:2018-07-26 20:15:41

标签: php json

我正试图提出一种简单的方法,用于从多个json数据源中提取数据,其中,引用存储在字符串文字中。当对象结构已知时,这很容易做到,但是有什么方法可以使php像直接在代码中那样解释字符串文字吗?

$data = json_decode('
    {
      "foo": 1,
      "object": {
        "foo": 1.1,
        "bar": 1.2
      },
      "array": [
        "foo",
        "bar"
      ]
    }
');

// Explicitly coded reference all work, of course
var_dump($data->foo); // int(1)
var_dump($data->object->foo); // float(1.1)
var_dump($data->array[0]); // string(3) "foo"

我知道我可以从这样的字符串文字访问对象的属性:

$string = 'foo';
var_dump($data->$string); // int(1)
var_dump($data->object->$string); // float(1.1)

是否有任何方法可以实现第二个和第三个引用,而不必分解字符串并递归遍历对象直到找到每个元素?

$string = 'object->foo';
var_dump($data->$string);

$string = 'array[0]';
var_dump($data->$string);

如果PHP本身没有东西可以处理,是否有一个库或我可以用来简化此过程的任何东西?

编辑:为了提供更多的信息,此应用程序可以通过UI配置JSON提要,并且管理员可以从JSON提要中提取值。对于更简单的JSON结构,此方法效果很好,但在尝试提取诸如$foo->bar->baz[0]->qux->corge之类的值时会失效。我试图找到一种更简单的方法来在结构更改时获取诸如此类的值,而我无法说明代码中的所有可能性。

1 个答案:

答案 0 :(得分:1)

由于您使用的是JSON,因此我将使用JSON指针。 Here is their official spec

他们所做的是为json对象提供查询语言(类似于XPath for XML)。在foo中访问您的object将导致类似/object/foo的查询。

现在,您要让用户指定json指针查询,并使用json pointer library执行实际查询。这样做的好处是,如果您决定放弃PHP而使用Java,则只需为Java使用JSON指针实现,并且您的用户不会受到更改的影响。