日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、語法

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

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

如果一個 JSON 指針值不符合這個語法,則屬于錯誤的條件。

二、語法示例

JSON Pointer 語法所有引號“"” (%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.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": "初學乍練",
            "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 代碼:

// 讀取 json 為 JsonNode
JsonNode 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 插件生成)

@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 并轉換成 UserGrowthInfo Bean:

// 讀取 json 為 JsonNode
JsonNode jsonNode = JsonUtil.readTree(json);
// 讀取 user_growth_info 節點
JsonNode userGrowthInfoNode = jsonNode.at("/data/user_growth_info");
// 轉換成 UserGrowthInfo bean
UserGrowthInfo 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 來讀取我們想要的結果:

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

分享到:
標簽:jackson
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定