fix toJSON & toJavaObject, for issue #2227

This commit is contained in:
wenshao 2025-03-04 07:26:49 +08:00
parent 35ec71105c
commit 8a2abcce62
4 changed files with 55 additions and 6 deletions

View File

@ -1,9 +1,6 @@
package com.alibaba.fastjson2.reader;
import com.alibaba.fastjson2.JSONB;
import com.alibaba.fastjson2.JSONException;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.*;
import com.alibaba.fastjson2.util.TypeUtils;
import java.lang.reflect.Type;
@ -235,6 +232,19 @@ public final class ObjectReaderInterface<T>
} else {
object = new JSONObject(map);
}
for (FieldReader fieldReader : fieldReaders) {
Object fieldValue = object.get(fieldReader.fieldName);
if (fieldValue instanceof Map) {
ObjectReader objectReader = fieldReader.getObjectReader(JSONFactory.getDefaultObjectReaderProvider());
if (objectReader instanceof ObjectReaderAdapter) {
if (object == map) {
object = new JSONObject(map);
}
Object fieldValue1 = objectReader.createInstance((Map) fieldValue, features);
object.put(fieldReader.fieldName, fieldValue1);
}
}
}
return (T) TypeUtils.newProxyInstance(objectClass, object);
}
}

View File

@ -675,6 +675,16 @@ public class ObjectWriterAdapter<T>
if (fieldValue == object) {
fieldValue = jsonObject;
}
if (fieldWriter instanceof FieldWriterObject && !(fieldValue instanceof Map)) {
ObjectWriter valueWriter = fieldWriter.getInitWriter();
if (valueWriter == null) {
valueWriter = JSONFactory.getObjectWriter(fieldWriter.fieldType, this.features | features);
}
if (valueWriter instanceof ObjectWriterAdapter) {
ObjectWriterAdapter objectWriterAdapter = (ObjectWriterAdapter) valueWriter;
fieldValue = objectWriterAdapter.toJSONObject(fieldValue);
}
}
jsonObject.put(fieldWriter.fieldName, fieldValue);
}

View File

@ -5,7 +5,6 @@ import com.alibaba.fastjson2.JSONWriter;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
public class Issue1396 {
@Test
@ -33,7 +32,7 @@ public class Issue1396 {
// Unknown instance type
LivingObject living = JSONObject.parseObject(userJsonString, LivingObject.class);
assertNull(living.getSignature().toString()); // -> "null"
assertEquals(name, living.getSignature().toString()); // -> "null"
assertEquals(name, living.getSignatureString()); // -> "bob"
assertEquals(name, living.withSignatureString()); // -> This method 'withSignatureString' is not a getter
}
@ -63,6 +62,10 @@ public class Issue1396 {
this.sign = sign;
}
public String getSign() {
return sign;
}
@Override
public String toString() {
return sign;

View File

@ -0,0 +1,26 @@
package com.alibaba.fastjson2.issues_2200
import com.alibaba.fastjson2.JSON
import com.alibaba.fastjson2.JSONObject
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
class Issue2227 {
@Test
fun testAssertJSONObjectWithVersion2() {
val jsonObject = JSON.toJSON(OuterClass()) as JSONObject
// 以下断言失败
Assertions.assertTrue(jsonObject["nestedClass"] is JSONObject)
}
@Test
fun testAssertJSONObjectWithVersion1() {
val jsonObject = com.alibaba.fastjson.JSON.toJSON(OuterClass()) as com.alibaba.fastjson.JSONObject
// 以下断言成功
Assertions.assertTrue(jsonObject["nestedClass"] is com.alibaba.fastjson.JSONObject)
}
data class OuterClass(val id: Int = 1, val nestedClass: NestedClass = NestedClass())
data class NestedClass(val id: Int = 2)
}