This commit is contained in:
Looly 2024-08-04 23:11:56 +08:00
parent 072924c3a2
commit cd048987a0
3 changed files with 66 additions and 13 deletions

View File

@ -12,8 +12,10 @@
package org.dromara.hutool.json.engine;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONFactory;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.reader.ObjectReader;
import com.alibaba.fastjson2.writer.ObjectWriter;
import java.io.Reader;
@ -27,16 +29,27 @@ import java.lang.reflect.Type;
* @since 6.0.0
*/
public class FastJSON2Engine implements JSONEngine {
private final JSONWriter.Context writerContext;
private final JSONReader.Context readerContext;
/**
* 构造
*/
public FastJSON2Engine() {
this.writerContext = JSONFactory.createWriteContext();
this.readerContext = JSONFactory.createReadContext();
}
@Override
public void serialize(final Object bean, final Writer writer) {
final JSONWriter.Context context = new JSONWriter.Context();
try (final JSONWriter jsonWriter = JSONWriter.ofUTF8(context)) {
try (final JSONWriter jsonWriter = JSONWriter.of(this.writerContext)) {
if (bean == null) {
jsonWriter.writeNull();
} else {
jsonWriter.setRootObject(bean);
final Class<?> valueClass = bean.getClass();
final ObjectWriter<?> objectWriter = context.getObjectWriter(valueClass, valueClass);
final ObjectWriter<?> objectWriter = this.writerContext.getObjectWriter(valueClass, valueClass);
objectWriter.write(jsonWriter, bean, null, null, 0);
}
@ -44,8 +57,19 @@ public class FastJSON2Engine implements JSONEngine {
}
}
@SuppressWarnings("unchecked")
@Override
public <T> T deserialize(final Reader reader, final Object type) {
return JSON.parseObject(reader, (Type) type);
final ObjectReader<T> objectReader = this.readerContext.getObjectReader((Type) type);
try (final JSONReader jsonReader = JSONReader.of(reader, this.readerContext)) {
if (jsonReader.isEnd()) {
return null;
}
final T object = objectReader.readObject(jsonReader, (Type) type, null, 0);
jsonReader.handleResolveTasks(object);
return object;
}
}
}

View File

@ -13,6 +13,8 @@
package org.dromara.hutool.json.engine;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
/**
@ -40,4 +42,29 @@ public interface JSONEngine {
* @return Java BeanPOJO对象
*/
<T> T deserialize(Reader reader, Object type);
/**
* 将Java BeanPOJO对象转换为JSON字符串
*
* @param bean Java BeanPOJO对象
* @return JSON字符串
*/
default String toJsonString(final Object bean) {
final StringWriter stringWriter = new StringWriter();
serialize(bean, stringWriter);
return stringWriter.toString();
}
/**
* 将JSON字符串转换为Java BeanPOJO对象
*
* @param <T> Java Bean对象类型
* @param jsonStr JSON字符串
* @param type Java BeanPOJO对象类型可以为{@code Class<T>}或者TypeReference
* @return Java BeanPOJO对象
*/
default <T> T fromJsonString(final String jsonStr, final Object type) {
final StringReader stringReader = new StringReader(jsonStr);
return deserialize(stringReader, type);
}
}

View File

@ -12,10 +12,12 @@
package org.dromara.hutool.json.engine;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.dromara.hutool.core.io.IORuntimeException;
import org.dromara.hutool.core.lang.wrapper.SimpleWrapper;
import org.dromara.hutool.json.JSONException;
import java.io.IOException;
@ -27,21 +29,21 @@ import java.io.Writer;
*
* @author Looly
*/
public class JacksonEngine implements JSONEngine{
private final ObjectMapper mapper;
public class JacksonEngine extends SimpleWrapper<ObjectMapper> implements JSONEngine{
/**
* 构造
*/
public JacksonEngine() {
this.mapper = new ObjectMapper();
super(new ObjectMapper());
// 允许出现单引号
raw.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
}
@Override
public void serialize(final Object bean, final Writer writer) {
try {
mapper.writeValue(writer, bean);
raw.writeValue(writer, bean);
} catch (final IOException e) {
throw new IORuntimeException(e);
}
@ -52,11 +54,11 @@ public class JacksonEngine implements JSONEngine{
public <T> T deserialize(final Reader reader, final Object type) {
try {
if(type instanceof Class){
return mapper.readValue(reader, (Class<T>)type);
return raw.readValue(reader, (Class<T>)type);
} else if(type instanceof TypeReference){
return mapper.readValue(reader, (TypeReference<T>)type);
return raw.readValue(reader, (TypeReference<T>)type);
} else if(type instanceof JavaType){
return mapper.readValue(reader, (JavaType)type);
return raw.readValue(reader, (JavaType)type);
}
} catch (final IOException e) {
throw new IORuntimeException(e);