Jackson-揭秘不为人知的-Pointer-语法-解锁其惊人的效用 (jackson)
一、语法
JSONPointer是一个蕴含零个或多个援用标志的Unicode字符串,每个援用标志以/(%x2F)字符为前缀。假设援用标志蕴含~(%x7E)或/(%x2F)字符,则它们必定区分被编码为~0和~1。它的ABNF语法如下:
json-pointer=*("/"reference-token)reference-token=*(unescaped/escaped)unescaped=%x00-2E/%x30-7D/%x7F-10FFFFescaped="~"("0"/"1")
假设一个JSON指针值不合乎这个语法,则属于失误的条件。
二、语法示例
JSONPointer语法一切引号"(%x22)、反斜杠(%x5C)和管理字符(%x00-1F)的实例必定被转义。例如,给定以下JSON文档
{"foo":["bar","baz"],"":0,"a/b":1,"c%d":2,"e^f":3,"g|h":4,"i\j":5,"k"l":6,"":7,"m~n":8}
那么以下JSON字符串运行标志和对应的值:
""//读取整个文档"/foo"["bar","baz"]"/foo/0""bar"//读取数组、汇合中的第0个元素"/"0"/a~1b"1"/c%d"2"/e^f"3"/g|h"4"/i\j"5"/k"l"6"/"7"/m~0n"8
三、复杂Json示例
示例json文本(节选自笔者掘金用户消息):
{"err_no":0,"err_msg":"success","data":{"user_name":"如梦技术","description":"生存不止眼前的苟且,还有诗和远方的旷野。","blog_address":"https://www.dreamlu","user_growth_info":{"user_id":1591748566975837,"jpower":4056,"jscore":1208.1,"jpower_level":4,"jscore_level":5,"jscore_title":"先锋掘友","author_achievement_list":[],"vip_level":1,"vip_title":"初学乍练","jscore_next_level_score":2000,"jscore_this_level_mini_score":500,"vip_score":0}}}
需求是只有要失掉jscore_title字段,失掉这个值依照上文的语法咱们的完整援用标志为:/data/user_growth_info/jscore_title。笔者驳回mica中的mica-core中的Jsonutil作为jackson的辅佐工具类(这应该也是市面上最好用和最全的一个jacksonjson工具类)。示例代码:
//读取json为JsonNodeJsonNodejsonNode=JsonUtil.readTree(json);//调用at方法,传入JSONPointer援用标志JsonNodetitleNode=jsonNode.at("/data/user_growth_info/jscore_title");//读取节点文本StringjsCoreTitle=titleNode.asText();System.out.println(jsCoreTitle);//先锋掘友
留意:经常使用JSONPointer语法失掉不存在的节点时也不会报错,在经常使用asText、asInt等方法失掉节点的值时会自动前往null,当然这些方法也都有个带自动值的方法,十分好用。另外咱们也可以将某个节点转换成JavaBean,例如下面的user_growth_info节点,示例代码如下:UserGrowthInfoBean(经常使用ideaGsonFormatPlus插件生成)
@DatapublicclassUserGrowthInfo{@JsonProperty("user_id")privateLonguserId;@JsonProperty("jpower")privateIntegerjpower;@JsonProperty("jscore")privateDoublejscore;@JsonProperty("jpower_level")privateIntegerjpowerLevel;@JsonProperty("jscore_level")privateIntegerjscoreLevel;@JsonProperty("jscore_title")privateStringjscoreTitle;@JsonProperty("author_achievement_list")privateList<?>authorAchievementList;@JsonProperty("vip_level")privateIntegervipLevel;@JsonProperty("vip_title")privateStringvipTitle;@JsonProperty("jscore_next_level_score")privateIntegerjscoreNextLevelScore;@JsonProperty("jscore_this_level_mini_score")privateIntegerjscoreThisLevelMiniScore;@JsonProperty("vip_score")privateIntegervipScore;}
读取json并转换成UserGrowthInfoBean:
//读取json为JsonNodeJsonNodejsonNode=JsonUtil.readTree(json);//读取user_growth_info节点JsonNodeuserGrowthInfoNode=jsonNode.at("/data/user_growth_info");//转换成UserGrowthInfobeanUserGrowthInfouserGrowthInfo=JsonUtil.treeToValue(userGrowthInfoNode,UserGrowthInfo.class);System.out.println(userGrowthInfo);//输入结果:UserGrowthInfo(userId=1591748566975837,jpower=4056,jscore=1208.1,jpowerLevel=4,//jscoreLevel=5,jscoreTitle=先锋掘友,authorAchievementList=[],vipLevel=1,vipTitle=初学乍练,//jscoreNextLevelScore=2000,jscoreThisLevelMiniScore=500,vipScore=0)
四、总结
JacksonJSONPointer语法十分便捷易用,Jackson官方文档改版之后这个文档很难找到了。笔者从14年开局经常使用,并且将她融入到很多mica组建中。例如经常使用mica-http来读取咱们想要的结果:
//读取linkedin邮箱privateStringgetUserEml(StringaccessToken){returnHttpRequest.get("https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))").addHeader("Host","api.linkedin.com").addHeader("Connection","Keep-Alive").addHeader("Authorization","Bearer"+accessToken).execute().asJsonNode().at("/elements/0/handle~0/emailAddress").asText();}
![语法](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
Jackson还是十分好用的,宿愿此篇文章对大家有所协助!更多精彩好文敬请关注咱们!!!
Neither its cause nor its cure was understood分析句子
◆无宾语句。 意思是:【无论是病因还是治疗都不明白】主语是【 cause 或 cure】;谓语是【was understood】。 无宾语。
proud的所有语法
1. proud of + n./ doingHe is proud of his to doHe is proud to join the army.2. be proud of sth 对……充满骄傲be proud to do sth 自豪地去做某事be proud +从句be pride of ……的骄傲
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。