From c9cac93337dea67d99806b6920d995166199f51d Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 5 Sep 2024 02:35:06 +0800 Subject: [PATCH] add config --- .../hutool/json/engine/FastJSON2Engine.java | 17 ++++++++----- .../hutool/json/engine/GsonEngine.java | 9 +++++-- .../hutool/json/engine/HutoolJSONEngine.java | 1 + .../hutool/json/engine/JSONEngineConfig.java | 24 +++++++++++++++++++ .../hutool/json/engine/JacksonEngine.java | 15 ++++++++---- .../hutool/json/engine/FastJSONTest.java | 13 ++++++++++ .../dromara/hutool/json/engine/GsonTest.java | 13 ++++++++++ .../hutool/json/engine/HutoolJSONTest.java | 13 ++++++++++ .../hutool/json/engine/JacksonTest.java | 13 ++++++++++ 9 files changed, 105 insertions(+), 13 deletions(-) diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/FastJSON2Engine.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/FastJSON2Engine.java index 30b87a19c..fa5936d06 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/engine/FastJSON2Engine.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/FastJSON2Engine.java @@ -92,21 +92,26 @@ public class FastJSON2Engine extends AbstractJSONEngine { @Override protected void initEngine() { + JSONEngineConfig config; if(null == this.readerContext){ this.readerContext = JSONFactory.createReadContext(); - final String dateFormat = ObjUtil.defaultIfNull(this.config, JSONEngineConfig::getDateFormat, "millis"); - this.readerContext.setDateFormat(ObjUtil.defaultIfNull(dateFormat, "millis")); + + config = ObjUtil.defaultIfNull(this.config, JSONEngineConfig::of); + this.readerContext.setDateFormat(ObjUtil.defaultIfNull(config.getDateFormat(), "millis")); } if(null == this.writerContext){ final List features = ListUtil.of(); - if(ObjUtil.defaultIfNull(this.config, JSONEngineConfig::isPrettyPrint, false)){ + config = ObjUtil.defaultIfNull(this.config, JSONEngineConfig::of); + if(config.isPrettyPrint()){ features.add(JSONWriter.Feature.PrettyFormat); } + if(!config.isIgnoreNullValue()){ + features.add(JSONWriter.Feature.WriteMapNullValue); + } this.writerContext = JSONFactory.createWriteContext(features.toArray(new JSONWriter.Feature[0])); - // 自定义配置 - final String dateFormat = ObjUtil.defaultIfNull(this.config, JSONEngineConfig::getDateFormat, "millis"); - this.writerContext.setDateFormat(ObjUtil.defaultIfNull(dateFormat, "millis")); + // 自定义其它配置 + this.writerContext.setDateFormat(ObjUtil.defaultIfNull(config.getDateFormat(), "millis")); } } } diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/GsonEngine.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/GsonEngine.java index 49fdc42a7..40d11784e 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/engine/GsonEngine.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/GsonEngine.java @@ -78,11 +78,13 @@ public class GsonEngine extends AbstractJSONEngine { return; } + // 自定义配置 + final JSONEngineConfig config = ObjUtil.defaultIfNull(this.config, JSONEngineConfig::of); final GsonBuilder builder = new GsonBuilder(); - if (ObjUtil.defaultIfNull(this.config, JSONEngineConfig::isPrettyPrint, false)) { + if (config.isPrettyPrint()) { builder.setPrettyPrinting(); } - final String dateFormat = ObjUtil.apply(this.config, JSONEngineConfig::getDateFormat); + final String dateFormat = config.getDateFormat(); if (StrUtil.isNotEmpty(dateFormat)) { builder.setDateFormat(dateFormat); builder.registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, typeOfT, context) -> TimeUtil.parse(json.getAsString(), dateFormat)); @@ -95,6 +97,9 @@ public class GsonEngine extends AbstractJSONEngine { builder.registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, typeOfT, context) -> TimeUtil.of(json.getAsJsonPrimitive().getAsLong())); builder.registerTypeAdapter(LocalDateTime.class, (JsonSerializer) (date, type, jsonSerializationContext) -> new JsonPrimitive(TimeUtil.toEpochMilli(date))); } + if(!config.isIgnoreNullValue()){ + builder.serializeNulls(); + } this.gson = builder.create(); } diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/HutoolJSONEngine.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/HutoolJSONEngine.java index 632efe43c..15fa29184 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/engine/HutoolJSONEngine.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/HutoolJSONEngine.java @@ -64,6 +64,7 @@ public class HutoolJSONEngine extends AbstractJSONEngine { final JSONConfig hutoolSJONConfig = JSONConfig.of(); if(null != this.config){ hutoolSJONConfig.setDateFormat(this.config.getDateFormat()); + hutoolSJONConfig.setIgnoreNullValue(this.config.isIgnoreNullValue()); } this.hutoolSJONConfig = hutoolSJONConfig; diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/JSONEngineConfig.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/JSONEngineConfig.java index f83990786..f63e990d8 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/engine/JSONEngineConfig.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/JSONEngineConfig.java @@ -44,6 +44,10 @@ public class JSONEngineConfig implements Serializable { * 日期格式,null表示默认的时间戳 */ private String dateFormat; + /** + * 是否忽略null值 + */ + private boolean ignoreNullValue = true; /** * 获取是否启用格式化输出 @@ -85,4 +89,24 @@ public class JSONEngineConfig implements Serializable { this.dateFormat = dateFormat; return this; } + + /** + * 是否忽略null值 + * + * @return 是否忽略null值 + */ + public boolean isIgnoreNullValue() { + return this.ignoreNullValue; + } + + /** + * 设置是否忽略null值 + * + * @param ignoreNullValue 是否忽略null值 + * @return this + */ + public JSONEngineConfig setIgnoreNullValue(final boolean ignoreNullValue) { + this.ignoreNullValue = ignoreNullValue; + return this; + } } diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/JacksonEngine.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/JacksonEngine.java index 7b94f96ff..6ae47eed9 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/engine/JacksonEngine.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/JacksonEngine.java @@ -16,6 +16,7 @@ package org.dromara.hutool.json.engine; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JavaType; @@ -112,18 +113,22 @@ public class JacksonEngine extends AbstractJSONEngine { JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES ); + // 支持Java8+日期格式 + registerModule(mapper, "com.fasterxml.jackson.datatype.jsr310.JavaTimeModule"); + // 自定义配置 - if (ObjUtil.defaultIfNull(this.config, JSONEngineConfig::isPrettyPrint, false)) { + final JSONEngineConfig config = ObjUtil.defaultIfNull(this.config, JSONEngineConfig::of); + if(config.isPrettyPrint()){ mapper.enable(SerializationFeature.INDENT_OUTPUT); } - final String dateFormat = ObjUtil.apply(this.config, JSONEngineConfig::getDateFormat); + final String dateFormat = config.getDateFormat(); if(StrUtil.isNotEmpty(dateFormat)){ mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); mapper.setDateFormat(DateUtil.newSimpleFormat(dateFormat)); } - - // 支持Java8+日期格式 - registerModule(mapper, "com.fasterxml.jackson.datatype.jsr310.JavaTimeModule"); + if(config.isIgnoreNullValue()){ + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + } this.mapper = mapper; } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/FastJSONTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/FastJSONTest.java index de02063a2..b38c1aabd 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/FastJSONTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/FastJSONTest.java @@ -36,4 +36,17 @@ public class FastJSONTest { engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); Assertions.assertEquals("{\"date1\":\"2024-01-01 01:12:21\",\"date2\":\"2024-01-01 01:12:21\"}", engine.toJsonString(bean)); } + + @Test + void writeNullTest() { + final BeanWithDate bean = new BeanWithDate(null, null); + final JSONEngine engine = JSONEngineFactory.createEngine("fastjson"); + + String jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{}", jsonString); + + engine.init(JSONEngineConfig.of().setIgnoreNullValue(false)); + jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{\"date1\":null,\"date2\":null}", jsonString); + } } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/GsonTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/GsonTest.java index 42f4db406..56e7718e4 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/GsonTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/GsonTest.java @@ -37,4 +37,17 @@ public class GsonTest { engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); Assertions.assertEquals("{\"date1\":\"2024-01-01 01:12:21\",\"date2\":\"2024-01-01 01:12:21\"}", engine.toJsonString(bean)); } + + @Test + void writeNullTest() { + final BeanWithDate bean = new BeanWithDate(null, null); + final JSONEngine engine = JSONEngineFactory.createEngine("gson"); + + String jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{}", jsonString); + + engine.init(JSONEngineConfig.of().setIgnoreNullValue(false)); + jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{\"date1\":null,\"date2\":null}", jsonString); + } } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/HutoolJSONTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/HutoolJSONTest.java index ab13bb9b3..a307ed631 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/HutoolJSONTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/HutoolJSONTest.java @@ -33,4 +33,17 @@ public class HutoolJSONTest { engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); Assertions.assertEquals("{\"date1\":\"2024-01-01 01:12:21\",\"date2\":\"2024-01-01 01:12:21\"}", engine.toJsonString(bean)); } + + @Test + void writeNullTest() { + final BeanWithDate bean = new BeanWithDate(null, null); + final JSONEngine engine = JSONEngineFactory.createEngine("hutool"); + + String jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{}", jsonString); + + engine.init(JSONEngineConfig.of().setIgnoreNullValue(false)); + jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{\"date1\":null,\"date2\":null}", jsonString); + } } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/JacksonTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/JacksonTest.java index bfe327ecc..371cefe59 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/JacksonTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/JacksonTest.java @@ -40,4 +40,17 @@ public class JacksonTest { engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); Assertions.assertEquals("{\"date1\":\"2024-01-01 01:12:21\",\"date2\":\"2024-01-01T01:12:21\"}", engine.toJsonString(bean)); } + + @Test + void writeNullTest() { + final BeanWithDate bean = new BeanWithDate(null, null); + final JSONEngine engine = JSONEngineFactory.createEngine("jackson"); + + String jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{}", jsonString); + + engine.init(JSONEngineConfig.of().setIgnoreNullValue(false)); + jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{\"date1\":null,\"date2\":null}", jsonString); + } }