@梦浪的小虾米,给你一个实际案例,要解析的JSON:
{
"a": {
"b": 12345678
}
}
怎么用楼主说的解析器提取里面`b`的值呢,用如下代码(注意看那个value函数):
class demo
{
private $index = '/';
public function startDocument() {
// 为了方便dirname处理,从/root开始,避免从/开始。
$this->index = '/root';
}
public function endDocument() {
$this->index = '/';
}
public function startObject() {
$this->index .= "/{}";
}
public function endObject() {
$this->index = dirname($this->index);
}
public function startArray() {
$this->index .= '/[]';
}
public function endArray() {
$this->index = dirname($this->index);
}
public function key(string $key) {
$this->index .= '/'.urlendoce($key);
}
/**
* @param mixed $value the value as read from the parser, it may be a string, integer, boolean, etc
*/
public function value($value) {
if ($this->index == '/root/{}/a/{}/b') {
yield($value);
}
}
public function whitespace(string $whitespace): {}
}
/root/{}/a/{}/b,就是把JSON的层次用路径的形式表示出来了,它表示JSON开始后,先是一个对象,对象里有键a,然后a的值是一个对象,里面有键b。
而这个键b的值就是我们要提取的,所以用yield返回。