jsonpath 用于json字符串的解析,同xpath一样,通过路径的方式获取json某个对象的值。
jsonpath 使用非常简单, 常用的两个方法:
DocumentContext parse = JsonPath.parse(result);
parse.read("$.data.result[0].title")
首先它把字符串转成Json对象, 查找时,先把查找字符串转成PathToken对象,然后再Json对象中遍历查找。
有图,有真相
我们分析一下这两个函数的源码。
1. JsonPath.parse()
源码很简单,把json串用三方的json包解析成json对象, 包装到JsonContext中
class JsonPath
public static DocumentContext parse(String json) {
return new ParseContextImpl().parse(json);
}
class ParseContextImpl
public DocumentContext parse(String json) {
Object obj = configuration.jsonProvider().parse(json);
return new JsonContext(obj, configuration);
}
2.parse.read("$.data.result[0].title"),
先看几个重要的类,CompiledPath(查找入口及查找value 存放类),PathRef(Json对象包装类),PathToken(查找的路径包装类)
PathRef 及子类
PathToken 及子类来实现各种的路径(RootPathToken 查找的根路径对,PropertyPathToken key-value解析对象)
CompilePath 解析的时候,用几个辅助类, PathCompiler, CharacterIndex(字符串逐字母读取)
PathCompiler: 字符串解析类
readNextToken() 读取下一个
CompiledPath evaluate():
EvaluationContextImpl 中 root ,rootDocument 是Json对象.
如果是叶子结点,就添加到model 到 EvaluationContextImpl ,如果不是,就next 取下一个PathToken, 解析.