成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

鮮為人知的 jackson Pointer 語(yǔ)法,超好用!

開(kāi)發(fā) 前端
Jackson JSON Pointer 語(yǔ)法非常簡(jiǎn)單易用,Jackson 官網(wǎng)文檔改版之后這個(gè)文檔很難找到了。筆者從14年開(kāi)始使用,并且將她融入到很多 mica 組建中。

一、語(yǔ)法

JSON Pointer 是一個(gè)包含零個(gè)或多個(gè)引用標(biāo)記的 Unicode 字符串,每個(gè)引用標(biāo)記以 “/” (%x2F) 字符為前綴。如果引用標(biāo)記包含 “~” (%x7E) 或 “/” (%x2F) 字符,則它們必須分別被編碼為 “~0” 和 “~1”。它的 ABNF 語(yǔ)法如下:

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

如果一個(gè) JSON 指針值不符合這個(gè)語(yǔ)法,則屬于錯(cuò)誤的條件。

二、語(yǔ)法示例

JSON Pointer 語(yǔ)法所有引號(hào)“"” (%x22)、反斜杠“\” (%x5C)和控制字符(%x00-1F)的實(shí)例必須被轉(zhuǎn)義。例如,給定以下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 字符串應(yīng)用標(biāo)記和對(duì)應(yīng)的值:

""           // 讀取整個(gè)文檔
"/foo"       ["bar", "baz"]
"/foo/0"    "bar" // 讀取數(shù)組、集合中的第0個(gè)元素
"/"          0
"/a~1b"      1
"/c%d"       2
"/e^f"       3
"/g|h"       4
"/i\\j"      5
"/k\"l"      6
"/ "         7
"/m~0n"      8

三、復(fù)雜 Json 示例

示例 json 文本(節(jié)選自筆者掘金用戶信息):

{
    "err_no": 0,
    "err_msg": "success",
    "data": {
        "user_name": "如夢(mèng)技術(shù)",
        "description": "生活不止眼前的茍且,還有詩(shī)和遠(yuǎn)方的田野。",
        "blog_address": "https://www.dreamlu.net",
        "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": "初學(xué)乍練",
            "jscore_next_level_score": 2000,
            "jscore_this_level_mini_score": 500,
            "vip_score": 0
        }
    }
}

需求是只需要獲取 “jscore_title” 字段,獲取這個(gè)值按照上文的語(yǔ)法我們的完整引用標(biāo)記為:/data/user_growth_info/jscore_title。筆者采用 mica 中的 mica-core 中的 Jsonutil作為 jackson 的輔助工具類(這應(yīng)該也是市面上最好用和最全的一個(gè) jackson json 工具類)。示例 java 代碼:

// 讀取 json 為 JsonNode
JsonNode jsonNode = JsonUtil.readTree(json);
// 調(diào)用 at 方法,傳入 JSON Pointer 引用標(biāo)記
JsonNode titleNode = jsonNode.at("/data/user_growth_info/jscore_title");
// 讀取節(jié)點(diǎn)文本
String jsCoreTitle = titleNode.asText();
System.out.println(jsCoreTitle); // 先鋒掘友

注意:使用 JSON Pointer 語(yǔ)法獲取不存在的節(jié)點(diǎn)時(shí)也不會(huì)報(bào)錯(cuò),在使用 asText、asInt 等方法獲取節(jié)點(diǎn)的值時(shí)會(huì)默認(rèn)返回 null,當(dāng)然這些方法也都有個(gè)帶默認(rèn)值的方法,非常好用。另外我們也可以將某個(gè)節(jié)點(diǎn)轉(zhuǎn)換成 Java Bean,例如上面的 user_growth_info節(jié)點(diǎn),示例代碼如下:UserGrowthInfo Bean(使用 idea GsonFormatPlus 插件生成)

@Data
public 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 并轉(zhuǎn)換成 UserGrowthInfo Bean:

// 讀取 json 為 JsonNode
JsonNode jsonNode = JsonUtil.readTree(json);
// 讀取 user_growth_info 節(jié)點(diǎn)
JsonNode userGrowthInfoNode = jsonNode.at("/data/user_growth_info");
// 轉(zhuǎn)換成 UserGrowthInfo bean
UserGrowthInfo userGrowthInfo = JsonUtil.treeToValue(userGrowthInfoNode, UserGrowthInfo.class);
System.out.println(userGrowthInfo);
// 輸出結(jié)果:UserGrowthInfo(userId=1591748566975837, jpower=4056, jscore=1208.1, jpowerLevel=4, 
// jscoreLevel=5, jscoreTitle=先鋒掘友, authorAchievementList=[], vipLevel=1, vipTitle=初學(xué)乍練, 
// jscoreNextLevelScore=2000, jscoreThisLevelMiniScore=500, vipScore=0)

四、總結(jié)

Jackson JSON Pointer 語(yǔ)法非常簡(jiǎn)單易用,Jackson 官網(wǎng)文檔改版之后這個(gè)文檔很難找到了。筆者從14年開(kāi)始使用,并且將她融入到很多 mica 組建中。例如使用 mica-http 來(lái)讀取我們想要的結(jié)果:

// 讀取 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 還是非常好用的,希望此篇文章對(duì)大家有所幫助!更多精彩好文敬請(qǐng)關(guān)注我們!!!

責(zé)任編輯:武曉燕 來(lái)源: JAVA架構(gòu)日記
相關(guān)推薦

2010-01-07 10:05:51

IT顧問(wèn)特質(zhì)

2011-05-03 13:13:52

編程PHPJava

2014-04-22 16:38:12

GitHubGitHub 使用技巧

2009-09-14 09:45:20

Chrome谷歌操作系統(tǒng)

2023-04-23 15:11:26

2019-10-08 16:24:33

Chrome瀏覽器

2009-07-09 17:38:35

2022-05-30 09:01:13

CSS技巧前端

2014-07-29 14:25:43

Unix命令

2015-08-18 10:57:52

機(jī)房制冷數(shù)據(jù)中心

2017-11-08 14:55:16

Linux命令sudo

2024-04-30 08:32:18

CSS元素網(wǎng)格

2015-06-09 11:12:31

Swift語(yǔ)言Swift特性

2018-07-20 09:01:39

2023-12-06 08:46:20

CSSFlex內(nèi)幕

2019-12-12 20:49:05

JavaScript語(yǔ)言運(yùn)算符

2022-08-23 09:01:02

HTMLWeb

2010-03-23 16:53:19

Visual Stud

2009-02-09 09:16:28

熱鍵自注銷漏洞

2024-03-04 16:32:02

JavaScript運(yùn)算符
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字字幕一区二区三区四区五区 | av黄色在线播放 | 91精品久久久久久综合五月天 | 少妇精品亚洲一区二区成人 | 精品视频一区在线 | 日一区二区 | 亚洲激情一区二区三区 | 国产精品中文字幕在线 | 国产成人精品一区 | 国产精品一区二区三区在线 | 国产免费一区二区三区 | 日韩精品一区二区久久 | 久久久精彩视频 | 欧美日韩久久精品 | 国产亚洲第一页 | 日韩亚洲视频 | 亚洲一区二区视频 | 超碰成人免费 | 久久国产高清 | 亚洲精品68久久久一区 | 久久久久久久久久久久亚洲 | 成人免费黄色片 | 国产精品高潮呻吟久久 | 精品国产伦一区二区三区观看方式 | 久久av一区 | cao在线| 欧美在线观看一区 | 欧美成人影院 | 欧美一级毛片在线播放 | 中文字幕乱码一区二区三区 | 成人一区二区三区在线观看 | 99久久精品国产一区二区三区 | 一级看片免费视频 | 国产亚洲一区二区在线观看 | 久久国产欧美日韩精品 | 亚洲一区二区三区在线观看免费 | 欧美99| 国产精品一区二区三区在线 | 黄色免费网站在线看 | 欧美一区二区三区视频在线播放 | 亚洲精品一区二区 |