add config

This commit is contained in:
Looly 2024-09-05 02:35:06 +08:00
parent 979bbe2905
commit c9cac93337
9 changed files with 105 additions and 13 deletions

View File

@ -92,21 +92,26 @@ public class FastJSON2Engine extends AbstractJSONEngine {
@Override @Override
protected void initEngine() { protected void initEngine() {
JSONEngineConfig config;
if(null == this.readerContext){ if(null == this.readerContext){
this.readerContext = JSONFactory.createReadContext(); 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){ if(null == this.writerContext){
final List<JSONWriter.Feature> features = ListUtil.of(); final List<JSONWriter.Feature> 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); features.add(JSONWriter.Feature.PrettyFormat);
} }
if(!config.isIgnoreNullValue()){
features.add(JSONWriter.Feature.WriteMapNullValue);
}
this.writerContext = JSONFactory.createWriteContext(features.toArray(new JSONWriter.Feature[0])); 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(config.getDateFormat(), "millis"));
this.writerContext.setDateFormat(ObjUtil.defaultIfNull(dateFormat, "millis"));
} }
} }
} }

View File

@ -78,11 +78,13 @@ public class GsonEngine extends AbstractJSONEngine {
return; return;
} }
// 自定义配置
final JSONEngineConfig config = ObjUtil.defaultIfNull(this.config, JSONEngineConfig::of);
final GsonBuilder builder = new GsonBuilder(); final GsonBuilder builder = new GsonBuilder();
if (ObjUtil.defaultIfNull(this.config, JSONEngineConfig::isPrettyPrint, false)) { if (config.isPrettyPrint()) {
builder.setPrettyPrinting(); builder.setPrettyPrinting();
} }
final String dateFormat = ObjUtil.apply(this.config, JSONEngineConfig::getDateFormat); final String dateFormat = config.getDateFormat();
if (StrUtil.isNotEmpty(dateFormat)) { if (StrUtil.isNotEmpty(dateFormat)) {
builder.setDateFormat(dateFormat); builder.setDateFormat(dateFormat);
builder.registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, typeOfT, context) -> TimeUtil.parse(json.getAsString(), dateFormat)); builder.registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, typeOfT, context) -> TimeUtil.parse(json.getAsString(), dateFormat));
@ -95,6 +97,9 @@ public class GsonEngine extends AbstractJSONEngine {
builder.registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, typeOfT, context) -> TimeUtil.of(json.getAsJsonPrimitive().getAsLong())); builder.registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, typeOfT, context) -> TimeUtil.of(json.getAsJsonPrimitive().getAsLong()));
builder.registerTypeAdapter(LocalDateTime.class, (JsonSerializer<LocalDateTime>) (date, type, jsonSerializationContext) -> new JsonPrimitive(TimeUtil.toEpochMilli(date))); builder.registerTypeAdapter(LocalDateTime.class, (JsonSerializer<LocalDateTime>) (date, type, jsonSerializationContext) -> new JsonPrimitive(TimeUtil.toEpochMilli(date)));
} }
if(!config.isIgnoreNullValue()){
builder.serializeNulls();
}
this.gson = builder.create(); this.gson = builder.create();
} }

View File

@ -64,6 +64,7 @@ public class HutoolJSONEngine extends AbstractJSONEngine {
final JSONConfig hutoolSJONConfig = JSONConfig.of(); final JSONConfig hutoolSJONConfig = JSONConfig.of();
if(null != this.config){ if(null != this.config){
hutoolSJONConfig.setDateFormat(this.config.getDateFormat()); hutoolSJONConfig.setDateFormat(this.config.getDateFormat());
hutoolSJONConfig.setIgnoreNullValue(this.config.isIgnoreNullValue());
} }
this.hutoolSJONConfig = hutoolSJONConfig; this.hutoolSJONConfig = hutoolSJONConfig;

View File

@ -44,6 +44,10 @@ public class JSONEngineConfig implements Serializable {
* 日期格式null表示默认的时间戳 * 日期格式null表示默认的时间戳
*/ */
private String dateFormat; private String dateFormat;
/**
* 是否忽略null值
*/
private boolean ignoreNullValue = true;
/** /**
* 获取是否启用格式化输出 * 获取是否启用格式化输出
@ -85,4 +89,24 @@ public class JSONEngineConfig implements Serializable {
this.dateFormat = dateFormat; this.dateFormat = dateFormat;
return this; 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;
}
} }

View File

@ -16,6 +16,7 @@
package org.dromara.hutool.json.engine; package org.dromara.hutool.json.engine;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JavaType;
@ -112,18 +113,22 @@ public class JacksonEngine extends AbstractJSONEngine {
JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES 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); mapper.enable(SerializationFeature.INDENT_OUTPUT);
} }
final String dateFormat = ObjUtil.apply(this.config, JSONEngineConfig::getDateFormat); final String dateFormat = config.getDateFormat();
if(StrUtil.isNotEmpty(dateFormat)){ if(StrUtil.isNotEmpty(dateFormat)){
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.setDateFormat(DateUtil.newSimpleFormat(dateFormat)); mapper.setDateFormat(DateUtil.newSimpleFormat(dateFormat));
} }
if(config.isIgnoreNullValue()){
// 支持Java8+日期格式 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
registerModule(mapper, "com.fasterxml.jackson.datatype.jsr310.JavaTimeModule"); }
this.mapper = mapper; this.mapper = mapper;
} }

View File

@ -36,4 +36,17 @@ public class FastJSONTest {
engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); 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)); 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);
}
} }

View File

@ -37,4 +37,17 @@ public class GsonTest {
engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); 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)); 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);
}
} }

View File

@ -33,4 +33,17 @@ public class HutoolJSONTest {
engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); 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)); 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);
}
} }

View File

@ -40,4 +40,17 @@ public class JacksonTest {
engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); 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)); 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);
}
} }