今天有时间把jayway.jsonpath源码看了一遍,记录下来。
jsonpath 使用非常简单, 常用的 JsonPath.parse(str), root.read('/root/'). 首先它把文档字符串转成JsonObject, 在查找时,先把查找字符串转成PathToken对象,然后再查找。
我们分析一下这两个函数的源码。
1。 JsonPath.parse 源码很简单, 把json 串用三方的json包解析成jsonObject,
然后封装成JsonContext , JsonContext 是DocumentContext的一个实现. parse函数返回 DocumentContext.
2. root.read('') ,首先是解析路径字符串,用'.' 分割成PathToken (PathToken 是链表, 用next 指向下一节点)
PathToken 下的子类来实现各种的路径(RootPathToken 代表jsonpath 根类)
解析的时候,用几个辅助类, PathCompiler, CharacterIndex(字符串逐字母读取)
PathCompiler: 字符串解析类
readNextToken() 读取下一个
PERIOD 就是 '.' , 分割字符串.
解析完 在CompiledPath 类 root变量存储 PathToken
JsonPath.read():
CompiledPath:
evaluate 来计算json 路径的值
EvaluationContextImpl 中 root 就是PathToken, rootDocument 是上面分析的jsonObject.
如果是叶子结点,就添加到model 到 EvaluationContextImpl 中(model 就是最后取的值),如果不是,就next 取下一个PathToken, 解析.