精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot玩轉JSON!解鎖Jackson的八大高階技能,太強了

開發 前端
本篇文章將介紹使用Jackson庫處理JSON數據的多種高級技術,涵蓋了JSON解析、查詢、序列化/反序列化控制等核心功能。主要實現了以下能力:JSON路徑查詢:通過findValue()和at()方法實現嵌套JSON結構的深度查詢,多值提取:支持批量獲取相同名稱的多個值。

環境:SpringBoot3.4.2

1. 簡介

本篇文章將介紹使用Jackson庫處理JSON數據的多種高級技術,涵蓋了JSON解析、查詢、序列化/反序列化控制等核心功能。主要實現了以下能力:

  • JSON路徑查詢:通過findValue()和at()方法實現嵌套JSON結構的深度查詢
  • 多值提取:支持批量獲取相同名稱的多個值
  • 視圖控制:使用@JsonView實現字段級序列化控制,區分公開和內部視圖
  • 動態屬性處理:通過@JsonAnySetter/Getter處理未知字段,實現靈活的動態對象
  • 對象展開:使用@JsonUnwrapped將嵌套對象屬性扁平化到父級
  • 原始JSON保留:通過@JsonRawValue保持字符串字段的原始JSON格式

這些功能組合構成了強大的JSON數據處理能力,適用于API開發、配置解析、數據轉換等場景,特別適合需要靈活處理復雜JSON結構的Java應用程序。

2.實戰案例

2.1 findValue查找值

Jackson中的findValue()方法允許我們在JSON樹中搜索特定鍵值并獲取其關聯的值。首先,我們將使用ObjectMapper將JSON字符串轉換為JsonNode,從而創建JSON數據的樹形表示:

@Test
public void test1() throws Exception {
  String json = """
      {
        "user": {
          "id": 1,
          "name": "Pack_xg",
          "details": {
            "email": "pack@gmail.com",
            "phone": "18999999999"
          }
        }
      }
      """ ;
  ObjectMapper mapper = new ObjectMapper();
  JsonNode rootNode = mapper.readTree(json) ;


  String email = rootNode.findValue("email").asText();
  System.err.println(email) ;
}
輸出結果
pack@gmail.com

2.2 優雅處理缺失的鍵

在處理 JSON 時,我們可能會遇到鍵值缺失的情況。當 JSON 結構中找不到指定鍵時,findValue() 方法將返回 null。如下示例:

@Test
public void test2() throws Exception {
  String json = """
      {
        "user": {
          "id": 1,
          "name": "Pack_xg",
          "details": {
            "phone": "18999999999"
          }
        }
      }
      """ ;
  ObjectMapper mapper = new ObjectMapper();
  JsonNode rootNode = mapper.readTree(json);
  JsonNode emailNode = rootNode.findValue("email");
  System.err.println(emailNode) ;
}
輸出結果
null

在此示例中,findValue("email") 返回 null,因為 JSON 中不存在 email 鍵。

2.3 使用 findValues() 方法處理數組

findValues方法查找指定名稱的JSON對象字段的方法——包括直接子值和后代值——并將找到的字段作為List返回。

@Test
public void test3() throws Exception {
  String json = """
        {
          "users": [
            { "id": 1, "name": "pack", "details": { "email": "pack@gmail.com" } },
            { "id": 2, "name": "xg", "details": { "email": "xg@qq.com" } }
          ]
        }
      """;
  ObjectMapper mapper = new ObjectMapper();
  JsonNode rootNode = mapper.readTree(json);
  List<String> emails = rootNode.findValues("email")
      .stream()
      .map(JsonNode::asText)
      .toList() ;
  System.err.println(emails) ;
}
輸出結果
[pack@gmail.com, xg@qq.com]

2.4 處理深度嵌套的key

與其在JSON結構中通過名稱查找鍵值,我們可使用at()方法定位深層嵌套JSON結構中特定路徑下的字段。如下示例:

@Test
public void test4() throws Exception {
  String json = """
      {
        "company": {
          "dept": {
            "team": {
              "lead": {
                "name": "Pack_xg",
                "details": {
                  "email": "pack@gmail.com"
                }
              }
            }
          }
        }
      }
      """ ;


  ObjectMapper mapper = new ObjectMapper();
  JsonNode rootNode = mapper.readTree(json);
  String email = rootNode.at("/company/dept/team/lead/details/email").asText() ;
  System.err.println(email) ;
}
輸出結果
pack@gmail.com

此處傳遞給 at() 方法的路徑是一個 JSON 指針,它是一種使用字符串語法遍歷 JSON 文檔的標準化方式。

2.5 使用@JsonView視圖控制字段輸出

用于指示由被注解的方法或字段所定義的屬性所屬視圖(一個或多個)的注解。示例注解如下:

@JsonView(BasicView.class)

該注解指定,被注解的屬性在處理(序列化、反序列化)由BasicView.class(或其子類)標識的視圖時將被包含。如果包含多個視圖類標識符,則該屬性將屬于所有這些視圖。

public class User {
  public interface PublicView {}
  public interface InternalView extends PublicView {}
  @JsonView(PublicView.class)
  private String name;
  @JsonView(InternalView.class)
  private String email;
  @JsonView(InternalView.class)
  private String password;
}

測試用例

@Test
public void test5() throws Exception {
  User user = new User("Pack_xg", "pack@gmail.com", "123456") ;
  // 使用
  ObjectMapper mapper = new ObjectMapper();
  // 只輸出 public 字段
  String publicJson = mapper
      .writerWithView(User.PublicView.class)
      .writeValueAsString(user);
  System.err.println(publicJson) ;
  // 輸出所有字段
  String internalJson = mapper
      .writerWithView(User.InternalView.class)
      .writeValueAsString(user);
  System.err.println(internalJson) ;
}
輸出結果
{"name":"Pack_xg"}
{"name":"Pack_xg","email":"pack@gmail.com","password":"123456"}

2.6 處理未知屬性

@JsonAnySetter / @JsonAnyGetter 用于處理 JSON 中可能存在的額外字段,避免反序列化失敗。如下示例:

public class DynamicObject {
  private Long id ;
  private String name ;
  private Map<String, Object> properties = new HashMap<>();
  // ...
  @JsonAnySetter
  public void set(String name, Object value) {
    properties.put(name, value);
  }
  @JsonAnyGetter
  public Map<String, Object> getProperties() {
    return properties;
  }
}
測試用例
@Test
public void test6() throws Exception {
  String json = """
      {
        "id": 666,
        "name": "Pack_xg",
        "age": 33,
        "details": {
          "phone": "18999999999",
          "addr": "中國"
        }
      }
      """;
  ObjectMapper objectMapper = new ObjectMapper() ;
  // 反序列化:未知字段會被 @JsonAnySetter 捕獲
  DynamicObject user = objectMapper.readValue(json, DynamicObject.class);
  System.out.println(user);
  // 序列化:properties 中的內容會被 @JsonAnyGetter 寫回 JSON
  String serializedJson = objectMapper.writeValueAsString(user);
  System.out.println("\n重新序列化后的 JSON:");
  System.out.println(serializedJson);
}
輸出結果

圖片

2.7 扁平化嵌套對象

將嵌套對象的字段“展開”到外層。

public class Order {
  private Long id ;
  private String orderNo ;
  @JsonUnwrapped
  private Address address ;
}
public class Address {
  private String provice;
  private String city ;
  private String county ;
}
測試用例
@Test
public void test7() throws Exception {
  Order order = new Order(1L, "XP-00001", new Address("新疆", "烏魯木齊", "天山區")) ;
  ObjectMapper objectMapper = new ObjectMapper() ;
  System.err.println(objectMapper.writeValueAsString(order)) ;
}
輸出結果
{
  "id" : 1,
  "orderNo" : "XP-00001",
  "provice" : "新疆",
  "city" : "烏魯木齊",
  "county" : "天山區"
}

2.8 插入原始JSON

@JsonRawValue將一個字符串字段的內容直接作為原始 JSON 片段寫入最終的 JSON 輸出中,而不是將其轉義為字符串。這在你需要嵌入已生成的 JSON 或動態 JSON 結構時非常有用。如下示例:

public class Product {
  private String name ;
  private BigDecimal price ;
  /**json字符串內容*/
  @JsonRawValue
  private String details ;
}
測試用例
@Test
public void test7() throws Exception {
  Order order = new Order(1L, "XP-00001", new Address("新疆", "烏魯木齊", "天山區")) ;
  ObjectMapper objectMapper = new ObjectMapper() ;
  objectMapper.enable(SerializationFeature.INDENT_OUTPUT) ;
  System.err.println(objectMapper.writeValueAsString(order)) ;
}
輸出結果
{
  "name" : "Spring Boot3實戰案例200講",
  "price" : 70,
  "details" : {"author": "pack_xg", "page_count": 1000}
}

如果沒有@JsonRawValue注解,輸出結果如下:

{
  "name" : "Spring Boot3實戰案例200講",
  "price" : 70,
  "details" : "{\"author\": \"pack_xg\", \"page_count\": 1000}"
}

字符串被轉義了。

責任編輯:武曉燕 來源: Springboot全家桶實戰案例
相關推薦

2025-01-13 13:47:13

2025-05-14 01:00:00

Spring工具工廠類

2025-03-26 08:28:36

2025-08-07 09:30:57

2013-09-26 11:00:53

2025-01-22 14:02:35

2025-04-10 00:25:00

Spring@JsonView注解

2021-10-22 08:00:00

架構開發技術

2009-06-22 14:07:46

JSF優勢

2025-09-01 02:00:00

2023-03-06 08:03:10

Python可視化工具

2025-09-08 02:32:00

2025-01-02 12:51:06

2023-12-27 11:45:09

2012-05-10 16:45:54

linux系統

2011-04-29 09:15:16

Servlet

2024-04-24 09:52:19

云技能云遷移云計算

2010-11-08 11:31:34

職場

2025-02-08 08:00:00

JavaDeepSeekIDEA

2022-05-30 16:31:08

CSS
點贊
收藏

51CTO技術棧公眾號

久久久久福利视频| 亚洲免费小视频| 一区二区视频在线播放| 国产模特av私拍大尺度| 亚洲午夜极品| 亚洲国产精品久久久久| 激情视频综合网| a级片国产精品自在拍在线播放| 国产高清无密码一区二区三区| 992tv成人免费视频| 亚洲一区二区自偷自拍| 精品成人18| 欧美日韩亚洲91| 一区不卡字幕| 香蕉国产在线视频| 狠狠色丁香久久婷婷综合丁香| 久久久影视精品| 免费看日本黄色片| 女同另类激情重口| 91精品国产美女浴室洗澡无遮挡| 黄色免费视频大全| a级影片在线| 中文字幕巨乱亚洲| 精品欧美国产| 亚洲av无码乱码国产精品久久| 久色成人在线| 97精品国产aⅴ7777| 中国毛片直接看| 成人动漫免费在线观看| 日韩高清a**址| 又黄又爽又色的视频| 国产一区一一区高清不卡| 亚洲二区视频在线| 老司机午夜免费福利视频| 国产1区2区3区在线| 91蜜桃传媒精品久久久一区二区| 亚洲一区制服诱惑| 中文字幕欧美人妻精品| 麻豆精品网站| 81精品国产乱码久久久久久| 久久久久无码精品国产| 亚洲乱码免费伦视频| 色婷婷综合成人| 少妇av片在线观看| 国产成人一区| 亚洲日韩中文字幕| 婷婷色一区二区三区| 自拍偷拍精品| 亚洲毛片在线免费观看| 中文字幕一区二区久久人妻网站 | 成人网在线视频| 亚洲高清视频免费观看| 天堂va蜜桃一区二区三区漫画版| 69视频在线播放| 日韩在线视频免费播放| 99亚洲一区二区| 7777精品视频| 日本a级c片免费看三区| 久久五月激情| 国产精品第8页| 中文字幕在线播放不卡| 美女视频黄频大全不卡视频在线播放| 国产精品夫妻激情| 亚洲一级视频在线观看| 另类人妖一区二区av| 国产欧美一区二区| 国产强伦人妻毛片| 成人一区在线看| 国新精品乱码一区二区三区18| 欧洲精品久久一区二区| 2017欧美狠狠色| 日韩久久久久久久| 日本精品一区二区三区在线播放| 国产精品第四页| 激情视频小说图片| av不卡高清| 色素色在线综合| 自拍偷拍21p| 警花av一区二区三区| 精品久久久久久久人人人人传媒| 亚洲自拍偷拍精品| 最新亚洲精品| 精品国产欧美一区二区五十路 | 五月天久久久| 久久久久久亚洲| 一二三区免费视频| 精品一区中文字幕| 精品视频导航| 日本免费视频在线观看| 亚洲 欧美综合在线网络| 周于希免费高清在线观看| 亚洲激情自拍| 欧洲亚洲妇女av| 国产精品高清无码| 国产美女在线精品| 国产一区二区三区四区五区在线| 欧美视频综合| 激情av在线播放| 国产精品久久久99| 少妇久久久久久被弄到高潮| 激情综合在线观看| 奴色虐av一区二区三区| 久久国产精品色婷婷| 国产精成人品localhost| 九色视频在线播放| 亚洲激情自拍视频| 热久久精品国产| 亚洲成av人片在线观看www| 亚洲美女视频网站| 看片网站在线观看| 日本成人中文字幕| 国内精品视频免费| 国产婷婷视频在线| 91福利在线免费观看| 久久久男人的天堂| 97久久夜色精品国产| 538国产精品一区二区在线| 国产精品久久久久久无人区| 久久一区二区三区四区| 成人一区二区av| 四虎影视精品永久在线观看| 日韩国产欧美区| 999精品久久久| 久久久噜噜噜| 国产一区在线免费| 色呦呦在线看| 欧美精品日日鲁夜夜添| 一区二区三区伦理片| 在线一区欧美| 99一区二区| 麻豆网站在线| 欧美性生活影院| 色婷婷在线影院| 免费精品视频| 国产一区免费在线观看| 懂色av一区| 日韩一区二区免费在线观看| 久久精品色妇熟妇丰满人妻| 日韩精品电影在线观看| 欧美三级华人主播| 伊人成综合网站| 亚洲精品乱码久久久久久金桔影视| 精品国产精品国产精品| 精品夜夜嗨av一区二区三区| 日韩在线导航| 成人在线高清| 亚洲欧美日韩网| 国产suv精品一区二区33| 91麻豆国产香蕉久久精品| 阿v天堂2017| 伦理一区二区三区| 69精品小视频| 国产玉足榨精视频在线观看| 91极品美女在线| 美国黄色特级片| 麻豆成人免费电影| 亚洲AV无码成人精品一区| 国产精品日本一区二区不卡视频| 日韩中文字幕免费| 91丨porny丨在线中文| 亚洲三级在线看| 少妇愉情理伦片bd| 亚洲国产免费看| 久久伊人资源站| 最新日韩三级| 中文字幕亚洲无线码a| 国产精品欧美激情在线| 亚洲激情一二三区| 亚洲av无码一区二区三区观看| 中文字幕日韩经典| 激情五月色婷婷| 久久一二三四| 日韩欧美精品久久| 啪啪av大全导航福利综合导航| 久久五月情影视| 成人午夜免费福利| 欧美日韩一二三四五区| 中文字幕有码在线播放| 激情六月婷婷久久| 免费毛片网站在线观看| 神马电影久久| 91精品视频在线播放| 超碰在线网站| 亚洲欧美国产精品久久久久久久| 中文字幕乱码视频| 亚洲成人免费av| 久久亚洲无码视频| 国产黄人亚洲片| 欧美日韩在线视频一区二区三区| 精品精品99| 国产成人免费电影| 欧美成人精品三级网站| 久久99久久99精品中文字幕| 色综合视频在线| 欧美色老头old∨ideo| 国产亚洲欧美精品久久久久久| 91美女片黄在线观看| 99日在线视频| 国产精品综合色区在线观看| 亚洲精品在线免费| 精品久久对白| 91免费视频网站| 久久青青视频| 欧美精品激情在线观看| 最新av网站在线观看 | 色视频www在线播放国产成人| 丰满少妇在线观看bd| 欧美亚洲禁片免费| 日韩熟女精品一区二区三区| 国产精品久久久久永久免费观看| 欧美激情一区二区三区p站| 久久国产精品99久久久久久老狼| 久久av综合网| 亚洲九九视频| 亚洲精品一区国产精品| 九九视频精品全部免费播放| 国产精品白丝jk白祙| 四虎精品在线观看| 国产精品久久久久99| 国产精品高颜值在线观看| 免费91在线视频| 国产精品麻豆一区二区三区| 亚洲国产天堂久久综合网| 99视频在线观看免费| 欧美色图一区二区三区| 欧美精品一二三四区| 亚洲www啪成人一区二区麻豆| 久久国产高清视频| 中文一区一区三区高中清不卡| 精品夜夜澡人妻无码av| www.成人在线| 亚洲婷婷在线观看| 懂色av一区二区三区免费看| 国产xxxxhd| 国产在线视频一区二区| 亚洲国产成人va在线观看麻豆| 久久人人精品| 国产一区亚洲二区三区| 亚洲一区区二区| 18禁免费观看网站| 中文国产一区| 国产二区视频在线播放| 国产美女一区| 国产亚洲精品网站| 亚洲主播在线| 亚洲自偷自拍熟女另类| 亚洲尤物在线| 男人天堂成人在线| 日产国产欧美视频一区精品| 日韩有码免费视频| 日本不卡高清视频| mm131国产精品| 国产综合色精品一区二区三区| 中文字幕22页| 精一区二区三区| 色婷婷综合在线观看| 国产裸体歌舞团一区二区| 被黑人猛躁10次高潮视频| 国产成人丝袜美腿| 黄色网址在线视频| 久久久久国产精品免费免费搜索| 免费污网站在线观看| 国产欧美一区二区三区网站| 国产wwwwxxxx| 亚洲欧美日本在线| 国产在线视频你懂的| 五月天丁香久久| 国产99久久久久久免费看| 欧美日韩亚洲不卡| 国产av无码专区亚洲a∨毛片| 欧美xxxx在线观看| 四虎国产精品永远| 中文字幕日韩欧美在线| gogo在线观看| 午夜免费日韩视频| 日韩漫画puputoon| 亚洲专区在线视频| 天堂网av成人| 一本一生久久a久久精品综合蜜| 欧美激情日韩| 国产a级一级片| 国产在线精品一区二区夜色| 中文字幕一区二区三区人妻在线视频| kk眼镜猥琐国模调教系列一区二区| 日本黄色网址大全| 亚洲女性喷水在线观看一区| 国产 欧美 日韩 在线| 在线看国产一区| 精品国产av鲁一鲁一区| 亚洲欧洲一区二区三区在线观看| 免费日本一区二区三区视频| 97国产在线观看| 香蕉久久一区| 蜜桃久久精品乱码一区二区 | 久久精品视频16| 麻豆成人久久精品二区三区红 | 一区二区三区午夜| 精品国产麻豆免费人成网站| 国产色a在线| 久久全国免费视频| **日韩最新| 就去色蜜桃综合| 中文字幕午夜精品一区二区三区| 男人天堂网视频| 国产成人精品网址| 岛国片在线免费观看| 婷婷中文字幕一区三区| 国产美女明星三级做爰| 亚洲欧美一区二区激情| 第一av在线| 成人免费自拍视频| 国产日产一区| 乱妇乱女熟妇熟女网站| 激情五月播播久久久精品| 日本精品在线观看视频| 欧美日韩另类字幕中文| 成人小说亚洲一区二区三区| 色噜噜狠狠狠综合曰曰曰88av| 松下纱荣子在线观看| 99精彩视频| 五月开心六月丁香综合色啪 | 日韩高清精品免费观看| 538在线一区二区精品国产| 国产一级片在线播放| 68精品国产免费久久久久久婷婷| 日日夜夜精品视频| 99re99热| 精品一区二区三区免费毛片爱| 一级黄色片大全| 精品久久久视频| 熟妇高潮一区二区三区| 欧美风情在线观看| 91视频亚洲| 中文字幕一区二区三区最新| 日本午夜精品一区二区三区电影| brazzers精品成人一区| 欧美体内谢she精2性欧美| 天堂中文字幕av| 午夜精品三级视频福利| 狼人精品一区二区三区在线| av在线观看地址| 懂色av一区二区夜夜嗨| 久久精品视频9| 亚洲成**性毛茸茸| 91视频欧美| 久久精品日韩| 亚洲欧美春色| www亚洲色图| 欧美日本免费一区二区三区| 午夜伦理在线| 91亚洲精华国产精华| 午夜欧美理论片| 在线观看免费视频国产| 亚洲第一狼人社区| 少妇精品视频一区二区| 欧美制服第一页| 国产一区二区在线| 亚洲欧美自偷自拍另类| 国产精品第一页第二页第三页| 国产免费黄色大片| 欧美高清无遮挡| 全国精品免费看| 中文字幕无码不卡免费视频| 国产精品视频第一区| 国产乱人乱偷精品视频| 欧美另类极品videosbest最新版本 | 99精品在线| 爱情岛论坛亚洲自拍| 午夜精品视频在线观看| 日韩大胆视频| 国产精品一区二区三区在线播放| 久久久久久久久丰满| av电影在线播放| 色综合欧美在线| 求av网址在线观看| 国产伦精品一区二区| 午夜亚洲福利在线老司机| 久久婷婷五月综合| 91精品欧美综合在线观看最新| 色yeye免费人成网站在线观看| 精品久久sese| 久久激情五月婷婷| 久久久久无码国产精品| 亚洲午夜精品视频| 国产激情精品一区二区三区| 国产精品国产亚洲精品看不卡| 久久精品一区二区三区av| 国产麻豆免费视频| 热久久这里只有精品| 五月综合激情| 成人精品在线观看视频| 欧美猛男超大videosgay| 成人ssswww在线播放| 午夜免费电影一区在线观看| 国产成人精品免费视频网站| 五月天激情国产综合婷婷婷| 欧美成人激情图片网| 欧美女王vk| 大尺度在线观看| 欧美精品xxxxbbbb|