当前位置:首页 > 科技  > 软件

鲜为人知的 jackson Pointer 语法,超好用!

来源: 责编: 时间:2023-12-05 09:23:50 308观看
导读一、语法JSON Pointer 是一个包含零个或多个引用标记的 Unicode 字符串,每个引用标记以 “/” (%x2F) 字符为前缀。如果引用标记包含 “~” (%x7E) 或 “/” (%x2F) 字符,则它们必须分别被编码为 “~0” 和 “~1”。它

一、语法

JSON Pointer 是一个包含零个或多个引用标记的 Unicode 字符串,每个引用标记以 “/” (%x2F) 字符为前缀。如果引用标记包含 “~” (%x7E) 或 “/” (%x2F) 字符,则它们必须分别被编码为 “~0” 和 “~1”。它的 ABNF 语法如下:VQQ28资讯网——每日最新资讯28at.com

json-pointer = *( "/" reference-token )reference-token = *( unescaped / escaped )unescaped = %x00-2E / %x30-7D / %x7F-10FFFFescaped = "~" ( "0" / "1" )

如果一个 JSON 指针值不符合这个语法,则属于错误的条件。VQQ28资讯网——每日最新资讯28at.com

二、语法示例

JSON Pointer 语法所有引号“"” (%x22)、反斜杠“/” (%x5C)和控制字符(%x00-1F)的实例必须被转义。例如,给定以下JSON文档VQQ28资讯网——每日最新资讯28at.com

{  "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 字符串应用标记和对应的值:VQQ28资讯网——每日最新资讯28at.com

""           // 读取整个文档"/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 文本(节选自笔者掘金用户信息):VQQ28资讯网——每日最新资讯28at.com

{    "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 的辅助工具类(这应该也是市面上最好用和最全的一个 jackson json 工具类)。示例 java 代码:VQQ28资讯网——每日最新资讯28at.com

// 读取 json 为 JsonNodeJsonNode jsonNode = JsonUtil.readTree(json);// 调用 at 方法,传入 JSON Pointer 引用标记JsonNode titleNode = jsonNode.at("/data/user_growth_info/jscore_title");// 读取节点文本String jsCoreTitle = titleNode.asText();System.out.println(jsCoreTitle); // 先锋掘友

注意:使用 JSON Pointer 语法获取不存在的节点时也不会报错,在使用 asText、asInt 等方法获取节点的值时会默认返回 null,当然这些方法也都有个带默认值的方法,非常好用。另外我们也可以将某个节点转换成 Java Bean,例如上面的 user_growth_info节点,示例代码如下:UserGrowthInfo Bean(使用 idea GsonFormatPlus 插件生成)VQQ28资讯网——每日最新资讯28at.com

@Datapublic class UserGrowthInfo {    @JsonProperty("user_id")    private Long userId;    @JsonProperty("jpower")    private Integer jpower;    @JsonProperty("jscore")    private Double jscore;    @JsonProperty("jpower_level")    private Integer jpowerLevel;    @JsonProperty("jscore_level")    private Integer jscoreLevel;    @JsonProperty("jscore_title")    private String jscoreTitle;    @JsonProperty("author_achievement_list")    private List<?> authorAchievementList;    @JsonProperty("vip_level")    private Integer vipLevel;    @JsonProperty("vip_title")    private String vipTitle;    @JsonProperty("jscore_next_level_score")    private Integer jscoreNextLevelScore;    @JsonProperty("jscore_this_level_mini_score")    private Integer jscoreThisLevelMiniScore;    @JsonProperty("vip_score")    private Integer vipScore;}

读取 json 并转换成 UserGrowthInfo Bean:VQQ28资讯网——每日最新资讯28at.com

// 读取 json 为 JsonNodeJsonNode jsonNode = JsonUtil.readTree(json);// 读取 user_growth_info 节点JsonNode userGrowthInfoNode = jsonNode.at("/data/user_growth_info");// 转换成 UserGrowthInfo beanUserGrowthInfo userGrowthInfo = 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)

四、总结

Jackson JSON Pointer 语法非常简单易用,Jackson 官网文档改版之后这个文档很难找到了。笔者从14年开始使用,并且将她融入到很多 mica 组建中。例如使用 mica-http 来读取我们想要的结果:VQQ28资讯网——每日最新资讯28at.com

// 读取 linkedin 邮箱private String getUserEmail(String accessToken) {    return HttpRequest.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();}

Jackson 还是非常好用的,希望此篇文章对大家有所帮助!更多精彩好文敬请关注我们!!!VQQ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-38107-0.html鲜为人知的 jackson Pointer 语法,超好用!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 中国东航:第三架 C919 国产大飞机预计将于近期交付

下一篇: 数据处理利器:Pandas带你游刃有余操控结构化数据

标签:
  • 热门焦点
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 华为Mate60标准版细节曝光:经典星环相机模组回归

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top