国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

動(dòng)態(tài)JSON怎么處理?Spring Boot五種強(qiáng)大的處理方式

開發(fā) 前端
在Web應(yīng)用開發(fā)中,面對(duì)日益復(fù)雜的業(yè)務(wù)場(chǎng)景,客戶端傳遞的JSON數(shù)據(jù)可能并不是固定結(jié)構(gòu),如可變字段、嵌套對(duì)象或用戶自定義配置。

環(huán)境:SpringBoot3.4.2

1. 簡(jiǎn)介

在Web應(yīng)用開發(fā)中,面對(duì)日益復(fù)雜的業(yè)務(wù)場(chǎng)景,客戶端傳遞的JSON數(shù)據(jù)可能并不是固定結(jié)構(gòu),如可變字段、嵌套對(duì)象或用戶自定義配置。

首先,我們來看如下的場(chǎng)景:

public class Person {
  private String name ;
  private Integer age ;
  // getters, setters
}
@PostMapping("/create")
public Person queryUser(@RequestBody Person person) {
  return person ;
}

當(dāng)我們通過如下的請(qǐng)求body訪問時(shí):

圖片圖片

控制臺(tái)輸出

圖片圖片

未知的email字段。

注:該錯(cuò)誤在當(dāng)前我使用的Spring Boot下是需要開啟如下配置才會(huì)出現(xiàn)上面的錯(cuò)誤

spring:
  jackson:
    deserialization:
      fail-on-unknown-properties: true

傳統(tǒng)固定DTO難以滿足此類需求,因此需要API具備處理動(dòng)態(tài)JSON Body的能力。Spring Boot憑借其靈活的請(qǐng)求處理機(jī)制,為我們提供了多種應(yīng)對(duì)方案,能夠有效支持結(jié)構(gòu)不固定的請(qǐng)求數(shù)據(jù),從而提升接口的靈活性和復(fù)用性。

本文將介紹在Spring Boot中處理動(dòng)態(tài)JSON Body的5種常用方式。

2.實(shí)戰(zhàn)案例

2.1 使用Map集合

使用 Map<String, Object> 接收動(dòng)態(tài)JSON Body,可靈活處理結(jié)構(gòu)不確定的請(qǐng)求數(shù)據(jù)。Spring Boot自動(dòng)將JSON鍵值對(duì)映射為Map條目,適用于字段可變、嵌套復(fù)雜或用戶自定義的場(chǎng)景,結(jié)合業(yè)務(wù)邏輯動(dòng)態(tài)解析,提升接口適應(yīng)性與擴(kuò)展性。

@PostMapping("/way1")
public ResponseEntity<?> way1(@RequestBody Map<String, Object> body) {
  return ResponseEntity.ok(body) ;
}

圖片圖片

? 優(yōu)點(diǎn):靈活,支持任意字段;無需預(yù)定義DTO;易于動(dòng)態(tài)處理。

? 缺點(diǎn):類型不安全;易出錯(cuò);缺乏結(jié)構(gòu)校驗(yàn);代碼可讀性差。

2.2 使用JsonNode類型

使用 JsonNode 可精確解析任意結(jié)構(gòu)的動(dòng)態(tài)JSON Body。作為Jackson提供的樹模型,它支持遍歷、查詢和類型判斷,適合復(fù)雜嵌套或需深度操作的場(chǎng)景,結(jié)合ObjectMapper靈活處理,是處理不確定JSON的強(qiáng)力方案。

@PostMapping("/way2")
public ResponseEntity<?> createUser(@RequestBody JsonNode body) {
  System.err.printf("解析email字段: %s%n", body.get("email").asText()) ;
  return ResponseEntity.ok(body) ;
}

輸出結(jié)果

圖片圖片

解析email字段: pack@gmail.com

? 優(yōu)點(diǎn):結(jié)構(gòu)靈活,支持復(fù)雜嵌套;可精確訪問任意節(jié)點(diǎn);無需定義實(shí)體類。

? 缺點(diǎn):處理深層結(jié)構(gòu)時(shí)代碼冗長。

2.3 DTO + 動(dòng)態(tài)字段(Map)

有時(shí)你已知 80% 的字段,但需要允許額外字段。這時(shí)候我們可以通過 Jackson 注解讓 Person 類更具靈活性。

修改實(shí)體Person:

public class Person {
  private String name ;
  private Integer age ;
  private Map<String, Object> extra = new HashMap<>();
  @JsonAnySetter
  public void setExtra(String key, Object value) {
      extra.put(key, value);
  }
  @JsonAnyGetter
  public Map<String, Object> getExtra() {
    return extra;
  }
}
Controller接口
@PostMapping("/way3")
public ResponseEntity<?> way3(@RequestBody Person person) {
  System.err.println(person.getExtra()) ;
  return ResponseEntity.ok(person) ;
}
輸出結(jié)果

圖片圖片

{email=pack@gmail.com}

? 優(yōu)點(diǎn):強(qiáng)類型 + 靈活性;Jackson自動(dòng)捕獲未知字段

? 缺點(diǎn):模型稍顯復(fù)雜

2.4 使用ObjectNode

ObjectNode 是 JsonNode 的可變子類,適合處理動(dòng)態(tài)JSON Body。它提供增刪改查方法,可靈活構(gòu)建和修改JSON結(jié)構(gòu),結(jié)合 ObjectMapper 使用,適用于需動(dòng)態(tài)生成或修改JSON的場(chǎng)景,操作直觀且功能強(qiáng)大。

@PostMapping("/way4")
public ResponseEntity<?> way4(@RequestBody ObjectNode body) {
  body.set("author", new TextNode("pack_xg")) ;
  body.set("age", new IntNode(34)) ;
  return ResponseEntity.ok(body) ;
}

這里我們添加author字段,同時(shí)修改了age字段。

圖片圖片

? 優(yōu)點(diǎn):可動(dòng)態(tài)增刪改JSON;操作靈活;適合構(gòu)建和修改結(jié)構(gòu)。

? 缺點(diǎn):需要手動(dòng)操作邏輯。

2.5 動(dòng)態(tài)Json驗(yàn)證

動(dòng)態(tài)JSON Body因結(jié)構(gòu)不固定,傳統(tǒng)基于DTO的注解驗(yàn)證(如@NotNull)難以直接應(yīng)用。當(dāng)使用Map、JsonNode等接收數(shù)據(jù)時(shí),字段名和層級(jí)不確定,導(dǎo)致無法在編解碼階段自動(dòng)校驗(yàn)。這時(shí)候我們可以通過JSON Schema驗(yàn)證這種動(dòng)態(tài)的JSON數(shù)據(jù)。

首先,引入如下依賴

<!--該依賴用來生成要驗(yàn)證的json schema文件-->
<dependency>
  <groupId>com.github.victools</groupId>
  <artifactId>jsonschema-generator</artifactId>
  <version>4.38.0</version>
</dependency>
<!--該依賴用來校驗(yàn)json數(shù)據(jù)-->
<dependency>
  <groupId>com.networknt</groupId>
  <artifactId>json-schema-validator</artifactId>
  <version>1.5.6</version>
</dependency>

接下來,我們針對(duì)Person對(duì)象生成對(duì)應(yīng)的Schema

SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12, OptionPreset.PLAIN_JSON) ;
// 設(shè)置必須的字段
configBuilder.forFields()
  .withRequiredCheck(field -> "name".equals(field.getName()))
  .withRequiredCheck(field -> "age".equals(field.getName())) ;
// 構(gòu)建SchemaGeneratorConfig
SchemaGeneratorConfig config = configBuilder.build();
// 創(chuàng)建SchemaGenerator實(shí)例
SchemaGenerator generator = new SchemaGenerator(config);
// 根據(jù)User類生成Schema內(nèi)容
JsonNode jsonSchema = generator.generateSchema(targetType);
// 將JsonNode轉(zhuǎn)換為ObjectNode以便修改
ObjectNode schemaObject = (ObjectNode) jsonSchema;
// 設(shè)置additionalProperties為false,禁止額外屬性
schemaObject.put("additionalProperties", true);
// 打印生成的JSON Schema
return jsonSchema.toPrettyString() ;

內(nèi)容如下:

圖片圖片

最后,我們?cè)贑ontroller接口中進(jìn)行驗(yàn)證

@PostMapping("/validate")
public ResponseEntity<?> validate(@RequestBody ObjectNode body) throws Exception {
  InputStream is;
  try {
    is = new ClassPathResource("schemas/person.json").getInputStream();
  } catch (IOException e) {
    throw new RuntimeException(e) ;
  }
  JsonSchema schema = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V202012).getSchema(is) ;
  List<String> ret = schema.validate(body).stream().map(msg -> msg.getMessage()).toList() ;
  return ResponseEntity.ok(ret) ;
}
驗(yàn)證結(jié)果

圖片

關(guān)于這里的錯(cuò)誤提示內(nèi)容,我們可以自定義 jsv-messages_zh_CN.properties國際化資源文件。

責(zé)任編輯:武曉燕 來源: Springboot全家桶實(shí)戰(zhàn)案例
相關(guān)推薦

2025-08-08 01:55:00

SpringJSON日期

2023-10-08 20:31:18

React

2023-07-10 08:00:13

架構(gòu)Rest返回值

2025-02-07 09:11:04

JSON對(duì)象策略

2025-07-29 04:11:00

SpringJSON數(shù)據(jù)

2009-08-17 17:28:23

C#轉(zhuǎn)義字符

2009-08-19 17:30:38

C#轉(zhuǎn)義字符

2010-01-13 17:23:36

VB.NET動(dòng)態(tài)事件

2025-04-30 08:39:33

SpringMVC接口

2017-04-17 10:05:51

Hadoop錯(cuò)誤方式

2009-12-31 14:25:19

Silverlight

2025-01-26 00:00:25

限流組件HTTP

2025-10-29 01:45:00

toString()SpringJackson

2011-07-08 10:57:24

主域控制器額外域控制器AD

2010-01-18 16:58:29

VB.NET Over

2021-03-31 09:11:27

URLErrorHTTPError

2025-01-27 12:19:51

2024-04-07 08:50:00

GenAIAI人工智能

2011-11-25 10:25:27

SpringJava

2009-06-19 18:26:38

Spring事務(wù)配置
點(diǎn)贊
收藏

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

性欧美大战久久久久久久免费观看| 国产欧美高清在线| 视频一区二区不卡| 亚洲福利视频二区| 97影院理论午夜| 精品精品国产毛片在线看| 精品美女一区二区| 欧美成熟毛茸茸| 北条麻妃一区二区三区在线| 亚洲高清久久网| 国产精品99999| 亚洲成年人网站在线观看| 91精品无人成人www| 91麻豆swag| 精品欧美一区免费观看α√| 成人黄色在线看| 日韩一级片一区二区| 免费欧美日韩国产三级电影| 视频一区视频二区视频三区高| 亚洲综合不卡| 日韩动漫在线观看| 久久精品国内一区二区三区| 久久久午夜电影| 超碰超碰在线观看| 国产精品传媒在线| 最新理论片影院| 一本久久a久久精品亚洲| 黄色大片在线免费观看| 在线电影院国产精品| 伊人电影在线观看| 天堂精品在线视频| 欧美三级电影精品| 成人黄色免费电影| 国产99一区视频免费| 我看黄色一级片| 青青草成人免费在线视频| 精品综合久久久久久8888| www国产无套内射com| 99精品视频中文字幕| xxxx一级片| 亚洲一区免费视频| 毛片在线看片| 色琪琪综合男人的天堂aⅴ视频| www国产精品| 亚洲一区二区三区毛片| 国产精品美女| 青青草国产精品视频| 亚洲乱码日产精品bd| 国产精品一区二区婷婷| 精品国产99国产精品| 开心久久婷婷综合中文字幕| 91精品国产一区| 在线看片成人| 看av免费毛片手机播放| 红桃视频成人在线观看| sm在线观看| 日本韩国欧美精品大片卡二| 久久国产精品毛片| 老司机午夜av| 欧美日韩久久一区| 国产精品亚洲欧美一级在线| 97se在线视频| wwww国产精品欧美| 欧美日韩欧美| 3344国产精品免费看| 蜜桃视频一区| 成视频免费在线看| 亚洲精品久久久久中文字幕欢迎你| 精品少妇一区| 午夜精品美女久久久久av福利| 欧美男男激情freegay| 亚洲精品福利在线| 国产精品115| 免费国产一区二区| 国产精品美女久久久久久久久久久| 在线免费观看的av网站| 欧美情侣性视频| 久久精品亚洲| 一级毛片国产| 久久精品影视伊人网| 国产欧美日韩一区二区三区在线| 日韩avxxx| 91麻豆精品国产91久久久更新时间 | 91女厕偷拍女厕偷拍高清| 黄网站app在线观看下载视频大全官网| 精品国产3级a| 波多野结衣在线观看一区二区三区| 在线不卡日本| 91福利区一区二区三区| 欧美理伦片在线播放| 欧美日韩视频免费| 欧美日韩在线三级| 小嫩嫩12欧美| 玩弄中年熟妇正在播放| 日韩午夜在线影院| 手机亚洲手机国产手机日韩| 国产成人午夜精品5599| 欧美欧美在线| 欧美女子与性| 欧美精品国产精品| 国产一区二区三区电影在线观看| 中文字幕在线亚洲精品| 日韩欧美精品在线观看| 国产精品jk白丝蜜臀av小说| 欧美日韩一级二级| 成熟丰满熟妇高潮xxxxx视频| 国产99视频精品免视看7| 在线观看91久久久久久| 天天综合在线观看| 欧美三日本三级少妇三99| 一区二区三区在线视频观看 | 在线毛片观看| 成人综合色站| 一区二区三区四区乱视频| 一区在线不卡| avove在线观看| 6080午夜不卡| 午夜日韩福利| 四虎在线观看| 欧美又大粗又爽又黄大片视频| 99精品一区二区| 午夜久久中文| 波多野结衣三级在线| 欧美一卡二卡在线| 羞羞答答国产精品www一本| 日本视频在线免费观看| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 欧美激情在线视频二区| 成人av电影在线| 日韩一区二区三区免费| 一本二本三本亚洲码| 亚洲国产成人在线视频| 日韩精品电影一区亚洲| 男人天堂亚洲天堂| 中文字幕人成一区| 中文欧美在线视频| 久久综合九色综合97婷婷女人| 色综合久久久| 午夜精品久久久内射近拍高清| 按摩亚洲人久久| 国产亚洲一区二区三区四区| 成人中文字幕视频| 最新av中文字幕| 亚洲mm色国产网站| 欧美色精品在线视频| 国产精品视区| √最新版天堂资源网在线| 日本特级黄色大片| 亚洲丝袜av一区| 国产亚洲欧美日韩在线一区| 女人床在线观看| 精品久久人人做人人爱| 狠狠色丁香婷婷综合| 亚洲成a人片| 人妻无码视频一区二区三区| 69av成年福利视频| 午夜精品久久久| 午夜一级久久| 亚州一区二区三区| 97超碰在线资源站| 91视频免费进入| 亚洲第一页自拍| 岛国精品在线观看| 亚洲免费专区| 国产精品一区二区三区视频网站| 国产爆乳无码一区二区麻豆| 欧美黄色小视频| 精品欧美aⅴ在线网站| 日本午夜一区二区| 日韩第一区第二区| 日色在线视频| 日韩免费av电影| 久久成人精品电影| 色94色欧美sute亚洲13| 国内外成人在线| 亚洲亚洲免费| 美女隐私在线观看| 日本熟妇人妻xxxxx| 国产伦精品一区二区三区精品视频| 欧美午夜一区二区三区| 国产成人免费av在线| 欧美日韩中文一区二区| 免费在线看电影| 国产黄视频网站| 午夜欧美一区二区三区免费观看| 久久香蕉频线观| 欧美性猛交一区二区三区精品| 成人性生交大片免费看中文| 欧美激情电影| 欧洲一级精品| 成a人片在线观看www视频| 免费在线a视频| 精品国产区在线| 97在线视频观看| 亚洲成人精品视频| 亚洲国产精品一区二区www在线| 老司机免费视频一区二区| 热久久这里只有| 91亚洲精品国产| 波多野结衣一区二区|