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 c11a8876a..523be6554 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 @@ -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 deserialize(final Reader reader, final Object type) { - return JSON.parseObject(reader, (Type) type); + final ObjectReader 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; + } } } diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/JSONEngine.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/JSONEngine.java index a37a644de..6248c2ee4 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/engine/JSONEngine.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/JSONEngine.java @@ -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 Bean(POJO)对象 */ T deserialize(Reader reader, Object type); + + /** + * 将Java Bean(POJO)对象转换为JSON字符串 + * + * @param bean Java Bean(POJO)对象 + * @return JSON字符串 + */ + default String toJsonString(final Object bean) { + final StringWriter stringWriter = new StringWriter(); + serialize(bean, stringWriter); + return stringWriter.toString(); + } + + /** + * 将JSON字符串转换为Java Bean(POJO)对象 + * + * @param Java Bean对象类型 + * @param jsonStr JSON字符串 + * @param type Java Bean(POJO)对象类型,可以为{@code Class}或者TypeReference + * @return Java Bean(POJO)对象 + */ + default T fromJsonString(final String jsonStr, final Object type) { + final StringReader stringReader = new StringReader(jsonStr); + return deserialize(stringReader, type); + } } 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 626da3e20..14a2bfe66 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 @@ -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 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 deserialize(final Reader reader, final Object type) { try { if(type instanceof Class){ - return mapper.readValue(reader, (Class)type); + return raw.readValue(reader, (Class)type); } else if(type instanceof TypeReference){ - return mapper.readValue(reader, (TypeReference)type); + return raw.readValue(reader, (TypeReference)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);