Bagaimanakah SpringBoot menyepadukan Jackson?
1. Pengenalan kepada Jackson
Nota: Artikel ini membincangkan penggunaan terperinci Jackson Kelas alat Jackson ada di penghujung artikel, anda boleh salin dan tampal sahaja ia untuk digunakan. Jackson adalah salah satu komponen yang mesti digunakan dalam syarikat Alibaba's Fastjson juga biasa digunakan Gson (ini tidak berguna) Tetapi saya tidak tahu banyak mengenainya). Penghurai json lalai Spring MVC ialah Jackson. Jackson mempunyai banyak kekuatan. Jackson bergantung pada pakej balang yang lebih sedikit dan ringkas serta mudah digunakan. Berbanding dengan rangka kerja Java json yang lain seperti Gson, Jackson menghuraikan fail json yang besar dengan lebih pantas;
Pengetahuan tambahan:
Nama pakej versi 1.x Jackson ialah org.codehaus.jackson
,
Apabila menaik taraf kepada versi 2.x, perubahan nama pakej untuk com.fasterxml.jackson
.
Jackson mempunyai tiga pakej teras, iaitu Streaming
, Databid
dan Annotations
, yang melaluinya JSON boleh dikendalikan dengan mudah
jackson-core
: Pakej teras menyediakan API berkaitan berdasarkan penghuraian "mod aliran", termasuk JsonPaser dan JsonGenerator. Pelaksanaan dalaman Jackson menggunakan JsonGenerator dan JsonParser API penstriman berprestasi tinggi untuk menjana dan menghuraikan json.jackson-annotations
: Pakej anotasi, menyediakan fungsi anotasi standardjackson-databind
: Pakej mengikat data, menyediakan "pengikatan objek". API yang berkaitan dengan penghuraian "pasti" (ObjectMapper) dan penghuraian "model pokok" (JsonNode); API berdasarkan penghuraian "pengikatan objek" dan API penghuraian "model pokok" bergantung pada API berdasarkan penghuraian "mod aliran". Mengandungi dua pakej di atas, hanya import koordinat ini.
Persekitaran operasi:
idea2020.2
jdk1.8
springboot 2.7.9
Muat turun demo: Pergi terus ke sumber saya untuk memuat turun (contoh Jackson - dilampirkan Alat)
2. Pengenalan kepada Json
Nota: Sebagai pembangun Java, anda mesti mempelajari Json dalam projek semasa dengan pemisahan bahagian hadapan dan belakang, Json ialah format pertukaran Data yang paling biasa. Contohnya, anotasi @RequestBody dalam SpringBoot digunakan sebagai anotasi untuk menerima format Json Apabila menggunakan Postman untuk ujian, raw-json yang dihantar juga adalah data format Json.
Struktur perwakilan JSON:
Susun atur objek: Struktur objek bermula dengan pendakap "{" dan berakhir dengan pendakap "}", dan bahagian tengah terdiri daripada 0 atau lebih ", " Ia terdiri daripada pasangan "kunci (kata kunci)/nilai (nilai)" yang dipisahkan oleh "." Kata kunci dan nilai dipisahkan oleh ":", dan struktur sintaks adalah seperti kod. Berikut adalah contoh.
{ "array": [1,2,3], "boolean": true, "name": "cllb", "null": null, "age": 12345, "object": { "height": 100, "color": "红色" }, "string": "陈老老老板" }
3. Penyepaduan Springboot dengan Jackson
1. Cipta projek
Arahan: Cipta projek springboot kosong (versi 2.7.9). Saya tidak akan mengulanginya terlalu banyak di sini Sangat mudah untuk memilih komponen lombok semasa menciptanya, tanpa perlu menulis kaedah Dapatkan/Tetapkan.
Nota: Anda dapat melihat bahawa mengimport pakej databind akan mengimport baki dua pakej secara automatik.
2. Import koordinat
Arahan: Anda boleh melihat bahawa mengimport pakej databind akan mengimport baki dua pakej secara automatik.
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency>
3. Fail konfigurasi
a.
#指定日期格式,比如yyyy-MM-dd HH:mm:ss,或者具体的格式化类的全限定名 spring.jackson.date-format #指定日期格式化时区,比如America/Los_Angeles或者GMT+10. spring.jackson.time-zone #是否开启Jackson的反序列化 spring.jackson.deserialization #是否开启json的generators. spring.jackson.generator #指定Joda date/time的格式,比如yyyy-MM-ddHH:mm:ss). 如果没有配置的话,dateformat会作为backup spring.jackson.joda-date-time-format #指定json使用的Locale. spring.jackson.locale #是否开启Jackson通用的特性. spring.jackson.mapper #是否开启jackson的parser特性. spring.jackson.parser #指定PropertyNamingStrategy(CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES)或者指定PropertyNamingStrategy子类的全限定类名. spring.jackson.property-naming-strategy #是否开启jackson的序列化. spring.jackson.serialization #指定序列化时属性的inclusion方式,具体查看JsonInclude.Include枚举. spring.jackson.serialization-inclusion
b. Konfigurasi tersuai
Arahan:Di sini kami terus memberi anda kelas alat Jackson Konfigurasi tersuai merujuk kepada penetapan yang ditetapkan kepada object_mapper dalam kelas alat. . Semua kaedah tersedia, dan demonstrasi dilakukan secara langsung menggunakan kelas alat.
spring: jackson: #日期格式化 date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 #设置空如何序列化 default-property-inclusion: non_null serialization: #格式化输出 indent_output: true #忽略无法转换的对象 fail_on_empty_beans: false deserialization: #允许对象忽略json中不存在的属性 fail_on_unknown_properties: false parser: #允许出现特殊字符和转义符 allow_unquoted_control_chars: true #允许出现单引号 allow_single_quotes: true
4. Kelas entiti
Arahan:Buat kelas entiti pengguna di sini
package com.clllb.jackson.utils; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.*; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.List; @Slf4j public class JacksonUtil { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static final ObjectMapper OBJECT_MAPPER_SNAKE_CASE = new ObjectMapper(); // 日期格式化 private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss"; static { //对象的所有字段全部列入 OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.ALWAYS); //取消默认转换timestamps形式 OBJECT_MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); //忽略空Bean转json的错误 OBJECT_MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss OBJECT_MAPPER.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT)); //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误 OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } static { //对象的所有字段全部列入 OBJECT_MAPPER_SNAKE_CASE.setSerializationInclusion(JsonInclude.Include.ALWAYS); //取消默认转换timestamps形式 OBJECT_MAPPER_SNAKE_CASE.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); //忽略空Bean转json的错误 OBJECT_MAPPER_SNAKE_CASE.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss OBJECT_MAPPER_SNAKE_CASE.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT)); //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误 OBJECT_MAPPER_SNAKE_CASE.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //转换为下划线 OBJECT_MAPPER_SNAKE_CASE.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); } private JacksonUtil() { } /** * 对象转Json格式字符串 * * @param obj 对象 * @return Json格式字符串 */ public static <T> String obj2String(T obj) { if (obj == null) { return null; } try { return obj instanceof String ? (String) obj : OBJECT_MAPPER.writeValueAsString(obj); } catch (JsonProcessingException e) { log.warn("Parse Object to String error : {}", e.getMessage()); return null; } } /** * 对象转file * @param fileName * @param obj */ public static void obj2File(String fileName,Object obj){ if (obj == null){ return; } try { OBJECT_MAPPER.writeValue(new File(fileName),obj); } catch (IOException e) { e.printStackTrace(); } } /** * 对象转Json格式字符串; 属性名从驼峰改为下划线形式 * * @param obj 对象 * @return Json格式字符串 */ public static <T> String obj2StringFieldSnakeCase(T obj) { if (obj == null) { return null; } try { ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE; return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj); } catch (JsonProcessingException e) { log.warn("Parse Object to String error : {}", e.getMessage()); return null; } } /** * 字符串转换为自定义对象; 属性名从下划线形式改为驼峰 * * @param str 要转换的字符串 * @param clazz 自定义对象的class对象 * @return 自定义对象 */ public static <T> T string2ObjFieldLowerCamelCase(String str, Class<T> clazz) { if (StringUtils.isEmpty(str) || clazz == null) { return null; } try { ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE; return clazz.equals(String.class) ? (T) str : objectMapper.readValue(str, clazz); } catch (Exception e) { log.warn("Parse String to Object error : {}", e.getMessage()); return null; } } /** * 字符串转换为自定义对象(List); 属性名从下划线形式改为驼峰 * * @param str 要转换的字符串 * @param typeReference 自定义对象的typeReference List 对象 * @return 自定义对象 */ public static <T> List<T> string2ListFieldLowerCamelCase(String str, TypeReference<List<T>> typeReference) { if (StringUtils.isEmpty(str) || typeReference == null) { return null; } try { ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE; return objectMapper.readValue(str, typeReference); } catch (Exception e) { log.warn("Parse String to Object error : {}", e.getMessage()); return null; } } /** * 对象转Json格式字符串(格式化的Json字符串) * * @param obj 对象 * @return 美化的Json格式字符串 */ public static <T> String obj2StringPretty(T obj) { if (obj == null) { return null; } try { return obj instanceof String ? (String) obj : OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(obj); } catch (JsonProcessingException e) { log.warn("Parse Object to String error : {}", e.getMessage()); return null; } } /** * 字符串转换为自定义对象 * * @param str 要转换的字符串 * @param clazz 自定义对象的class对象 * @return 自定义对象 */ public static <T> T string2Obj(String str, Class<T> clazz) { if (StringUtils.isEmpty(str) || clazz == null) { return null; } try { return clazz.equals(String.class) ? (T) str : OBJECT_MAPPER.readValue(str, clazz); } catch (Exception e) { log.warn("Parse String to Object error : {}", e.getMessage()); return null; } } /** * 字符串转换为自定义字段转为list * @param str * @param typeReference * @param <T> * @return */ public static <T> T string2Obj(String str, TypeReference<T> typeReference) { if (StringUtils.isEmpty(str) || typeReference == null) { return null; } try { return (T) (typeReference.getType().equals(String.class) ? str : OBJECT_MAPPER.readValue(str, typeReference)); } catch (IOException e) { log.warn("Parse String to Object error", e); return null; } } public static <T> T string2Obj(String str, Class<?> collectionClazz, Class<?>... elementClazzes) { JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametricType(collectionClazz, elementClazzes); try { return OBJECT_MAPPER.readValue(str, javaType); } catch (IOException e) { log.warn("Parse String to Object error : {}" + e.getMessage()); return null; } } }
Sampel projek:
5. Kelas ujianLaraskan kaedah secara langsung dalam kelas alat dalam kelas ujian, yang sangat mudah, dengan hasil output dilampirkan.
a.penukaran jenis objek kepada Json
Arahan:Gunakan kaedah writeValueAsString
package com.clllb.jackson.PO; import lombok.Data; import java.util.List; @Data public class User { private String username; private Integer age; private List<String> info; private Long userId; }
Hasil output:
{ " nama pengguna":"clllb","umur":24,"info":["satu juta","mendapat kekayaan"],"userId":1}b.Jenis objek fail penukaranArahan:
Gunakan kaedah writeValue
@Test void obj2string(){ User user = new User(); user.setUsername("clllb"); user.setAge(24); user.setUserId(1L); List<String> infoList = new ArrayList<>(); infoList.add("有一百万"); infoList.add("发大财"); user.setInfo(infoList); String json = JacksonUtil.obj2String(user); System.out.println(json); }
Hasil keluaran:
c.Rentetan jenis penukaran Objek jenis tersuaiGunakan kaedah readValue
@Test void string2obj(){ String json = "{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"userId\":11}"; User user = JacksonUtil.string2Obj(json, User.class); System.out.println(user); }
输出结果:
User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)
d.string类型转Object自定义类型list
说明: 使用readValue方法,传参变为TypeReference typeReference,这里工具类用的重载方法名是相同的。
@Test void string2objList(){ String json = "[{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"userId\":11},\n" + "{\"username\":\"陈老老老板\",\"age\":25,\"info\":[\"有一千万\",\"发大大财\"],\"userId\":12}]"; List<User> user = JacksonUtil.string2Obj(json, new TypeReference<List<User>>(){}); user.forEach(System.out::println); }
输出结果:
User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)
User(username=陈老老老板, age=25, info=[有一千万, 发大大财], userId=12)
e.object类型转String(驼峰转下划线)
说明: 使用writeValueAsString方法,这里区别看工具类就会发现,就是多了一个设置OBJECT_MAPPER_SNAKE_CASE.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
@Test void obj2sringSnakeCase(){ User user = new User(); user.setUsername("clllb"); user.setAge(24); user.setUserId(11L); List<String> infoList = new ArrayList<>(); infoList.add("有一百万"); infoList.add("发大财"); user.setInfo(infoList); String json = JacksonUtil.obj2StringFieldSnakeCase(user); System.out.println(json); }
输出结果:
{"username":"clllb","age":24,"info":["有一百万","发大财"],"user_id":11}
f.string类型(下划线)转Object类型
<font color = 'red'><b>说明:</font> 使用readValue方法 ```java @Test void string2obj(){ String json = "{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"user_id\":11}"; User user = JacksonUtil.string2Obj(json, User.class); System.out.println(user); }
输出结果:
User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)
g.string类型(下划线)转Object自定义类型list
说明: 使用readValue方法,传参变为TypeReference typeReference,这里工具类用的重载方法名是相同的。
@Test void string2objSnakeCase(){ String json = "[{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"user_id\":11},\n" + "{\"username\":\"陈老老老板\",\"age\":25,\"info\":[\"有一千万\",\"发大大财\"],\"user_id\":12}]"; List<User> user = JacksonUtil.string2ListFieldLowerCamelCase(json, new TypeReference<List<User>>(){}); user.forEach(System.out::println); }
输出结果:
User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)
User(username=陈老老老板, age=25, info=[有一千万, 发大大财], userId=12)
Atas ialah kandungan terperinci Bagaimanakah SpringBoot menyepadukan Jackson?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Pengenalan kepada Jasypt Jasypt ialah perpustakaan java yang membenarkan pembangun menambah fungsi penyulitan asas pada projeknya dengan usaha yang minimum dan tidak memerlukan pemahaman yang mendalam tentang cara penyulitan berfungsi dengan tinggi untuk penyulitan sehala dan dua hala. teknologi penyulitan berasaskan piawai. Sulitkan kata laluan, teks, nombor, perduaan... Sesuai untuk penyepaduan ke dalam aplikasi berasaskan Spring, API terbuka, untuk digunakan dengan mana-mana pembekal JCE... Tambahkan kebergantungan berikut: com.github.ulisesbocchiojasypt-spring-boot-starter2 Faedah Jasypt melindungi keselamatan sistem kami Walaupun kod itu bocor, sumber data boleh dijamin.

1. Redis melaksanakan prinsip kunci teragih dan mengapa kunci teragih diperlukan Sebelum bercakap tentang kunci teragih, adalah perlu untuk menjelaskan mengapa kunci teragih diperlukan. Lawan daripada kunci yang diedarkan ialah kunci yang berdiri sendiri Apabila kami menulis program berbilang benang, kami mengelakkan masalah data yang disebabkan oleh mengendalikan pembolehubah yang dikongsi pada masa yang sama Kami biasanya menggunakan kunci untuk mengecualikan pembolehubah yang dikongsi bersama untuk memastikan ketepatannya pembolehubah yang dikongsi skop penggunaannya adalah dalam proses yang sama. Jika terdapat berbilang proses yang perlu mengendalikan sumber yang dikongsi pada masa yang sama, bagaimanakah ia boleh saling eksklusif? Aplikasi perniagaan hari ini biasanya merupakan seni bina perkhidmatan mikro, yang juga bermakna bahawa satu aplikasi akan menggunakan berbilang proses Jika berbilang proses perlu mengubah suai baris rekod yang sama dalam MySQL, untuk mengelakkan data kotor yang disebabkan oleh operasi yang tidak teratur, keperluan pengedaran. untuk diperkenalkan pada masa ini. Gaya dikunci. Ingin mencapai mata

Springboot membaca fail, tetapi tidak boleh mengakses perkembangan terkini selepas membungkusnya ke dalam pakej balang Terdapat situasi di mana springboot tidak boleh membaca fail selepas membungkusnya ke dalam pakej balang adalah tidak sah dan hanya boleh diakses melalui strim. Fail berada di bawah resources publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

Apabila Springboot+Mybatis-plus tidak menggunakan pernyataan SQL untuk melaksanakan operasi penambahan berbilang jadual, masalah yang saya hadapi akan terurai dengan mensimulasikan pemikiran dalam persekitaran ujian: Cipta objek BrandDTO dengan parameter untuk mensimulasikan parameter yang dihantar ke latar belakang bahawa adalah amat sukar untuk melaksanakan operasi berbilang jadual dalam Mybatis-plus Jika anda tidak menggunakan alatan seperti Mybatis-plus-join, anda hanya boleh mengkonfigurasi fail Mapper.xml yang sepadan dan mengkonfigurasi ResultMap yang berbau dan kemudian. tulis pernyataan sql yang sepadan Walaupun kaedah ini kelihatan menyusahkan, ia sangat fleksibel dan membolehkan kita

SpringBoot dan SpringMVC adalah kedua-dua rangka kerja yang biasa digunakan dalam pembangunan Java, tetapi terdapat beberapa perbezaan yang jelas antara mereka. Artikel ini akan meneroka ciri dan penggunaan kedua-dua rangka kerja ini dan membandingkan perbezaannya. Mula-mula, mari belajar tentang SpringBoot. SpringBoot telah dibangunkan oleh pasukan Pivotal untuk memudahkan penciptaan dan penggunaan aplikasi berdasarkan rangka kerja Spring. Ia menyediakan cara yang pantas dan ringan untuk membina bersendirian, boleh dilaksanakan

1. Sesuaikan RedisTemplate1.1, mekanisme siri lalai RedisAPI Pelaksanaan cache Redis berasaskan API menggunakan templat RedisTemplate untuk operasi cache data Di sini, buka kelas RedisTemplate dan lihat maklumat kod sumber kelas tersebut. Isytihar kunci, Pelbagai kaedah pesirilan nilai, nilai awal kosong @NullableprivateRedisSe

Dalam projek, beberapa maklumat konfigurasi sering diperlukan Maklumat ini mungkin mempunyai konfigurasi yang berbeza dalam persekitaran ujian dan persekitaran pengeluaran, dan mungkin perlu diubah suai kemudian berdasarkan keadaan perniagaan sebenar. Kami tidak boleh mengekodkan konfigurasi ini dalam kod. Adalah lebih baik untuk menulisnya dalam fail konfigurasi Sebagai contoh, anda boleh menulis maklumat ini dalam fail application.yml. Jadi, bagaimana untuk mendapatkan atau menggunakan alamat ini dalam kod? Terdapat 2 kaedah. Kaedah 1: Kita boleh mendapatkan nilai yang sepadan dengan kunci dalam fail konfigurasi (application.yml) melalui ${key} beranotasi dengan @Value Kaedah ini sesuai untuk situasi di mana terdapat sedikit perkhidmatan mikro projek, Apabila perniagaan adalah rumit, logik

Artikel ini akan menulis contoh terperinci untuk bercakap tentang perkembangan sebenar dubbo+nacos+Spring Boot. Artikel ini tidak akan merangkumi terlalu banyak pengetahuan teori, tetapi akan menulis contoh paling mudah untuk menggambarkan bagaimana dubbo boleh disepadukan dengan nacos untuk membina persekitaran pembangunan dengan cepat.
