fix toJSON & toJavaObject, for issue #2227
This commit is contained in:
parent
35ec71105c
commit
8a2abcce62
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user