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; 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.JSONWriter;
import com.alibaba.fastjson2.reader.ObjectReader;
import com.alibaba.fastjson2.writer.ObjectWriter; import com.alibaba.fastjson2.writer.ObjectWriter;
import java.io.Reader; import java.io.Reader;
@ -27,16 +29,27 @@ import java.lang.reflect.Type;
* @since 6.0.0 * @since 6.0.0
*/ */
public class FastJSON2Engine implements JSONEngine { 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 @Override
public void serialize(final Object bean, final Writer writer) { public void serialize(final Object bean, final Writer writer) {
final JSONWriter.Context context = new JSONWriter.Context(); try (final JSONWriter jsonWriter = JSONWriter.of(this.writerContext)) {
try (final JSONWriter jsonWriter = JSONWriter.ofUTF8(context)) {
if (bean == null) { if (bean == null) {
jsonWriter.writeNull(); jsonWriter.writeNull();
} else { } else {
jsonWriter.setRootObject(bean); jsonWriter.setRootObject(bean);
final Class<?> valueClass = bean.getClass(); 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); objectWriter.write(jsonWriter, bean, null, null, 0);
} }
@ -44,8 +57,19 @@ public class FastJSON2Engine implements JSONEngine {
} }
} }
@SuppressWarnings("unchecked")
@Override @Override
public <T> T deserialize(final Reader reader, final Object type) { 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; package org.dromara.hutool.json.engine;
import java.io.Reader; import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer; import java.io.Writer;
/** /**
@ -40,4 +42,29 @@ public interface JSONEngine {
* @return Java BeanPOJO对象 * @return Java BeanPOJO对象
*/ */
<T> T deserialize(Reader reader, Object type); <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; package org.dromara.hutool.json.engine;
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;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.dromara.hutool.core.io.IORuntimeException; import org.dromara.hutool.core.io.IORuntimeException;
import org.dromara.hutool.core.lang.wrapper.SimpleWrapper;
import org.dromara.hutool.json.JSONException; import org.dromara.hutool.json.JSONException;
import java.io.IOException; import java.io.IOException;
@ -27,21 +29,21 @@ import java.io.Writer;
* *
* @author Looly * @author Looly
*/ */
public class JacksonEngine implements JSONEngine{ public class JacksonEngine extends SimpleWrapper<ObjectMapper> implements JSONEngine{
private final ObjectMapper mapper;
/** /**
* 构造 * 构造
*/ */
public JacksonEngine() { public JacksonEngine() {
this.mapper = new ObjectMapper(); super(new ObjectMapper());
// 允许出现单引号
raw.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
} }
@Override @Override
public void serialize(final Object bean, final Writer writer) { public void serialize(final Object bean, final Writer writer) {
try { try {
mapper.writeValue(writer, bean); raw.writeValue(writer, bean);
} catch (final IOException e) { } catch (final IOException e) {
throw new IORuntimeException(e); throw new IORuntimeException(e);
} }
@ -52,11 +54,11 @@ public class JacksonEngine implements JSONEngine{
public <T> T deserialize(final Reader reader, final Object type) { public <T> T deserialize(final Reader reader, final Object type) {
try { try {
if(type instanceof Class){ if(type instanceof Class){
return mapper.readValue(reader, (Class<T>)type); return raw.readValue(reader, (Class<T>)type);
} else if(type instanceof TypeReference){ } else if(type instanceof TypeReference){
return mapper.readValue(reader, (TypeReference<T>)type); return raw.readValue(reader, (TypeReference<T>)type);
} else if(type instanceof JavaType){ } else if(type instanceof JavaType){
return mapper.readValue(reader, (JavaType)type); return raw.readValue(reader, (JavaType)type);
} }
} catch (final IOException e) { } catch (final IOException e) {
throw new IORuntimeException(e); throw new IORuntimeException(e);