精品欧美一区二区三区在线观看 _久久久久国色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在线播放| 精品97人妻无码中文永久在线| 国产黄色一区| 亚洲亚洲人成综合网络| 日韩精品一区二区三区色偷偷| 久久伊人成人网| 欧美综合一区| 亚洲国产精品电影在线观看| 在线观看的毛片| 午夜小视频福利在线观看| 久久综合久久综合久久| 91久久精品国产91久久性色tv| 欧美做爰啪啪xxxⅹ性| 麻豆一区二区麻豆免费观看| 欧美日韩国产三级| 国产日韩一区二区在线| 蜜芽在线免费观看| 欧美韩国日本一区| 久久久7777| 丰满少妇高潮在线观看| 久草精品在线观看| 国产精品国产三级国产aⅴ浪潮 | 日韩大片欧美大片| 亚洲精品国产精华液| 亚洲精品在线观看免费| 青青草视频在线免费观看| 国产成人激情av| 成人黄色在线观看| 中文字幕在线观看第二页| 久久久精品网| 日韩av免费一区| 国产一级做a爱片久久毛片a| 亚洲性人人天天夜夜摸| 久久视频免费在线播放| 国产视频精品免费| 日韩精品一区二区久久| 亚洲视频第一页| 疯狂揉花蒂控制高潮h| 成人性生交大片免费看96| 日韩一二三四区| 青青草精品在线| 二区三区精品| 欧美狂野另类xxxxoooo| 欧美日韩亚洲自拍| 青草综合视频| 欧美日韩国产综合久久| 在线观看av网页| 久久天天久久| 欧美一区二区三区日韩视频| 一级做a爱视频| 麻豆一二三区精品蜜桃| 日韩一区二区三区视频| 欧美一级大片免费看| japanese色系久久精品| 精品国产1区2区3区| 白嫩情侣偷拍呻吟刺激 | 欧美96在线丨欧| 久久伊人色综合| 99精品久久久久| 午夜精品久久| 2018日韩中文字幕| 国产成人精品777777| 久久一综合视频| 国产精品嫩草影院久久久| 这里只有久久精品视频| 国内外成人在线| 国产欧美日韩视频一区二区三区| 在线观看中文字幕av| 狠狠色狠狠色综合日日91app| 97国产在线观看| 日韩 欧美 亚洲| 老**午夜毛片一区二区三区| 国产成人精品午夜| 一级片视频免费| 成人美女视频在线看| 蜜桃av噜噜一区二区三| 秋霞成人影院| 亚洲第一成人在线| 99热手机在线| 日本超碰一区二区| 精品中文视频在线| 亚洲天堂一级片| 亚洲国产免费| 国产精品视频精品| 蜜桃在线一区二区| 国产精品亲子伦对白| 草b视频在线观看| 亚洲性猛交富婆| 国内精品免费**视频| 国产乱码精品一区二区三区中文 | 久久99国产精品麻豆| 久久精品91久久香蕉加勒比| 免费日韩在线视频| 日本视频一区二区| 国产精品久久久久久免费观看| 一区二区视频在线免费观看| 成熟亚洲日本毛茸茸凸凹| 欧洲精品国产| 欧美bbbxxxxx| 欧美日韩免费一区二区三区视频| 狠狠操精品视频| 欧美综合影院| 亚洲视频一区二区三区| 久久综合亚洲色hezyo国产| 日韩成人av影视| 精品欧美一区二区精品久久| 黄网页免费在线观看| 欧美性高潮床叫视频 | 日韩av二区在线播放| 粉嫩高清一区二区三区精品视频 | 黄色av网站免费观看| 国产精品一区不卡| 亚洲日本japanese丝袜| 成人片免费看| 亚洲国语精品自产拍在线观看| 亚洲av人人澡人人爽人人夜夜| 北条麻妃一区二区三区在线| 色噜噜久久综合伊人一本| 日本一区二区不卡在线| 国产一区二区三区av电影| www.一区二区三区| 色欲综合视频天天天| 中文字幕一区二区三区在线乱码| 午夜av免费观看| 亚洲欧美电影一区二区| 欧美性猛交久久久乱大交小说| 99久久er| 日韩国产精品视频| 久久久久久久99| 国产福利一区二区三区视频在线| 国产亚洲精品久久飘花| 日韩另类在线| 91精品国产色综合久久不卡蜜臀| 性猛交╳xxx乱大交| 91精品国产乱码久久久久久久| 久久99亚洲精品| 国产一区二区在线播放视频| 国产精品久久久99| 波多野结衣天堂| 欧美午夜精彩| 国产精品香蕉av| 3d成人动漫在线| 欧美视频中文一区二区三区在线观看 | 欧美亚洲国产日本| 日韩一级片免费观看| 亚洲va欧美va天堂v国产综合| 污污的网站18| 日韩1区2区| 国产欧美日韩中文字幕在线| 最新电影电视剧在线观看免费观看| 亚洲女与黑人做爰| 无码人妻少妇色欲av一区二区| 神马日本精品| 日本欧美中文字幕| 黄色av免费在线观看| 日本黄色一区二区| 日日操免费视频| 国产乱码一区二区三区| 97超碰国产精品| 日本午夜精品久久久| 日韩免费在线观看视频| 2019中文字幕在线视频| 91精品国产综合久久久蜜臀粉嫩| 国产激情在线免费观看| 天使萌一区二区三区免费观看| 亚洲一区二区三区香蕉| 国产盗摄一区二区| 亚洲精品久久久久国产| 亚洲大尺度在线观看| 1000部国产精品成人观看| 免费在线观看日韩av| 国产精品色网| 中文字幕一区综合| 国产精品xxx在线观看| 国产成人+综合亚洲+天堂| 精品欧美色视频网站在线观看| 色噜噜偷拍精品综合在线| ass极品国模人体欣赏| 国产精品1区二区.| 久久精品国产sm调教网站演员 | 99久久99久久| 中文字幕乱码在线播放| 精品国产区一区二区三区在线观看| 午夜精品久久久久久久久久久久久蜜桃| 久久国产精品99精品国产| 欧美日韩dvd| 综合国产视频| 亚洲综合精品一区二区| 天堂网在线最新版www中文网| 亚洲黄色有码视频| 正在播放亚洲精品| 亚洲第一成年网| 亚洲区一区二区三| 91色乱码一区二区三区| 久久久久久综合网| 久久午夜精品| 男人插女人视频在线观看| 国产精品99视频| 欧美日韩在线高清| 成人台湾亚洲精品一区二区| 国产精品一二区| 亚洲一区站长工具| 久久久亚洲福利精品午夜| 久久日韩视频| 亚洲天堂男人天堂| 欧美一区二区三区成人片在线| 亚洲国产wwwccc36天堂| 日本裸体美女视频| 国产亚洲精品福利| 三级黄色片网站| 成人一区二区三区视频在线观看 | 免播放器亚洲| 欧美亚洲色图视频| 亚洲天天综合| 亚洲日本japanese丝袜| 国内精品久久久久久久影视简单 | 欧美激情第6页| 免费网站成人| 亚洲免费中文字幕| 天堂中文网在线| 欧美一二三四区在线| 91麻豆国产在线| 欧美日韩一区不卡| 精品视频一二三区| 色婷婷av一区二区三区软件| 在线观看精品国产| 午夜视频在线观看一区二区三区| 亚洲国产欧美视频| 成人的网站免费观看| 国产视频精品视频| 不卡一区二区中文字幕| 免费不卡的av| 99久久久久久| 野花社区视频在线观看| 99re66热这里只有精品3直播 | 亚洲成av在线| 欧美最猛性xxxxx亚洲精品| 蜜桃视频在线观看播放| 97视频在线观看免费| 欧亚av在线| 日韩美女免费线视频| 欧美成a人片在线观看久| 国产精品2018| 激情久久一区二区| 成人精品在线观看| 日韩高清一区| 国产一区国产精品| 网友自拍一区| 日韩精品久久久免费观看| 日韩理论电影| 日本精品福利视频| 在线看片欧美| 北条麻妃在线视频| 麻豆精品久久久| 亚洲精品乱码久久久久久动漫| 亚洲专区一区| 成人黄色片免费| 好看的亚洲午夜视频在线| 人人妻人人添人人爽欧美一区| 欧美国产小视频| 日韩中文字幕亚洲精品欧美| 黄色精品一区| 免费午夜视频在线观看| 美女脱光内衣内裤视频久久网站| 奇米影视亚洲色图| 性8sex亚洲区入口| 五月激情婷婷在线| 风流少妇一区二区| 爱爱免费小视频| 国产人妖乱国产精品人妖| 中国毛片直接看| 亚洲.国产.中文慕字在线| 亚洲国产精品无码久久久| 8x福利精品第一导航| 特黄aaaaaaaaa真人毛片| 国产一区二区三区久久精品| 国产黄色在线观看| 日本韩国欧美精品大片卡二| 韩国理伦片久久电影网| 精品久久sese| 91影院成人| 成人在线免费在线观看| 开心九九激情九九欧美日韩精美视频电影| 免费裸体美女网站| 国模少妇一区二区三区| 亚洲欧美日韩色| 国产精品―色哟哟| 国产精品theporn动漫| 欧美吞精做爰啪啪高潮| 欧美一级性视频| 久久九九免费视频| 最新日韩三级| 国产日韩欧美二区| 91久久国产| 日韩亚洲在线视频| 成人毛片老司机大片| 亚洲女人毛茸茸高潮| 偷拍一区二区三区四区| 99久久亚洲精品日本无码| 日韩精品在线看| 日韩伦理av| 91精品啪aⅴ在线观看国产| 日本一区福利在线| 国产精品国三级国产av| 免费精品视频在线| 中文字幕一区二区人妻在线不卡| 国产亚洲短视频| 日韩精品国产一区二区| 欧美剧情电影在线观看完整版免费励志电影| 一本一道人人妻人人妻αv| 亚洲电影第1页| 国产剧情在线| 成人免费看吃奶视频网站| 国产一区二区三区天码| 无罩大乳的熟妇正在播放| 国产精品一区不卡| 国产高潮国产高潮久久久91| 欧美三级日韩在线| 成人动漫在线免费观看| 日本精品久久电影| 亚洲成人一品| 激情深爱综合网| 成人av网站在线| 欧美成人三级视频| 91精品福利在线一区二区三区 | 久99久在线视频| 久久天天久久| 色播亚洲视频在线观看| 久久经典综合| 成年人免费观看视频网站| 日韩欧美成人免费视频| 亚洲 欧美 精品| 911国产网站尤物在线观看| 激情小说亚洲色图| 久久久久久免费看| 不卡视频在线看| 日本一区二区欧美| 日韩精品久久久久| 成人免费无遮挡| 性欧美大战久久久久久久免费观看| 亚洲啊v在线观看| 国产又粗又长又爽又黄的视频| 99视频精品免费视频| 在线观看国产亚洲| 日韩精品中文字幕在线| 日本不卡免费高清视频在线| 国产一区免费| 久久久精品午夜少妇| 国产综合精品久久久久成人av| 亚洲在线中文字幕| 性做久久久久久久久久| 韩国美女主播一区| 国产精品密蕾丝视频下载| 在线免费视频a| 亚洲少妇30p| 色婷婷av一区二区三| 欧美自拍视频在线观看| 成人精品中文字幕| 毛毛毛毛毛毛毛片123| 亚洲影院在线观看| 手机亚洲第一页| 7777精品伊人久久久大香线蕉的 | 在线电影中文日韩| 黄色精品视频网站| 人妻激情另类乱人伦人妻| 国产 日韩 欧美大片| 亚洲免费激情视频| 这里只有精品在线观看| 精品国产鲁一鲁****| 日韩欧美不卡在线| 欧美韩日一区二区三区| 午夜精品久久久久久久爽| 97人人模人人爽人人喊中文字| 免费一区二区三区在线视频| 日韩精品一区在线视频| 久久这里只有精品首页| 91久久国语露脸精品国产高跟| 亚洲欧美成人一区二区在线电影| 白白色在线观看| 日日骚一区二区网站| 国产美女一区二区| 国语对白永久免费| 久久久精品在线| 视频一区中文| 欧洲成人午夜精品无码区久久| 亚洲精品伦理在线| 看电影就来5566av视频在线播放| 97在线看福利| 91综合久久| 99久久精品免费视频|