Skip to content

Commit a13020a

Browse files
authored
Fix 1563 android8 (#3848)
* fix add Iterable support for ObjectWriterCreator and ObjectWriterImplList, for issue #1563 (cherry picked from commit 688579d) * fix cast error when -Dfastjson2.creator=reflect, for issue #1563
1 parent 49f44e3 commit a13020a

9 files changed

Lines changed: 108 additions & 17 deletions

File tree

core/src/main/java/com/alibaba/fastjson2/util/TypeUtils.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4108,4 +4108,20 @@ public static Type getMapValueType(Type fieldType) {
41084108
}
41094109
return Object.class;
41104110
}
4111+
4112+
public static List toList(Object object) {
4113+
if (object == null) {
4114+
return null;
4115+
} else if (object instanceof List) {
4116+
return (List) object;
4117+
} else if (object instanceof Iterable) {
4118+
List list = new ArrayList();
4119+
for (Object item : (Iterable) object) {
4120+
list.add(item);
4121+
}
4122+
return list;
4123+
} else {
4124+
throw new JSONException("Can not cast '" + object.getClass() + "' to List");
4125+
}
4126+
}
41114127
}

core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterListFunc.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.function.Function;
99

1010
import static com.alibaba.fastjson2.JSONWriter.Feature.*;
11+
import static com.alibaba.fastjson2.util.TypeUtils.toList;
1112

1213
final class FieldWriterListFunc<T>
1314
extends FieldWriterList<T> {
@@ -39,7 +40,7 @@ public Object getFieldValue(T object) {
3940
public boolean write(JSONWriter jsonWriter, T object) {
4041
List value;
4142
try {
42-
value = function.apply(object);
43+
value = toList(function.apply(object));
4344
} catch (RuntimeException error) {
4445
if (jsonWriter.isIgnoreErrorGetter()) {
4546
return false;
@@ -80,7 +81,7 @@ public boolean write(JSONWriter jsonWriter, T object) {
8081

8182
@Override
8283
public void writeValue(JSONWriter jsonWriter, T object) {
83-
List list = function.apply(object);
84+
List list = toList(function.apply(object));
8485
if (list == null) {
8586
jsonWriter.writeNull();
8687
return;

core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterListMethod.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.List;
1111

1212
import static com.alibaba.fastjson2.JSONWriter.Feature.*;
13+
import static com.alibaba.fastjson2.util.TypeUtils.toList;
1314

1415
final class FieldWriterListMethod<T>
1516
extends FieldWriterList<T> {
@@ -42,7 +43,7 @@ public Object getFieldValue(Object object) {
4243
public boolean write(JSONWriter jsonWriter, T object) {
4344
List value;
4445
try {
45-
value = (List) getFieldValue(object);
46+
value = toList(getFieldValue(object));
4647
} catch (JSONException error) {
4748
if (jsonWriter.isIgnoreErrorGetter()) {
4849
return false;
@@ -87,7 +88,7 @@ public boolean write(JSONWriter jsonWriter, T object) {
8788

8889
@Override
8990
public void writeValue(JSONWriter jsonWriter, T object) {
90-
List value = (List) getFieldValue(object);
91+
List value = toList(getFieldValue(object));
9192

9293
if (value == null) {
9394
jsonWriter.writeNull();

core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterListStrFunc.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.function.Function;
99

1010
import static com.alibaba.fastjson2.JSONWriter.Feature.*;
11+
import static com.alibaba.fastjson2.util.TypeUtils.toList;
1112

1213
final class FieldWriterListStrFunc<T>
1314
extends FieldWriter<T> {
@@ -37,7 +38,7 @@ public Object getFieldValue(T object) {
3738
public boolean write(JSONWriter jsonWriter, T object) {
3839
List list;
3940
try {
40-
list = function.apply(object);
41+
list = toList(function.apply(object));
4142
} catch (RuntimeException error) {
4243
if (jsonWriter.isIgnoreErrorGetter()) {
4344
return false;
@@ -97,7 +98,7 @@ public boolean write(JSONWriter jsonWriter, T object) {
9798

9899
@Override
99100
public void writeValue(JSONWriter jsonWriter, T object) {
100-
List list = function.apply(object);
101+
List list = toList(function.apply(object));
101102
if (list == null) {
102103
jsonWriter.writeNull();
103104
return;

core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ public <T> FieldWriter<T> createFieldWriter(
740740
}
741741
}
742742

743-
if (fieldClass == List.class || fieldClass == ArrayList.class) {
743+
if (fieldClass == List.class || fieldClass == ArrayList.class || fieldClass == Iterable.class) {
744744
Type itemType = null;
745745
if (fieldType instanceof ParameterizedType) {
746746
itemType = ((ParameterizedType) fieldType).getActualTypeArguments()[0];
@@ -904,7 +904,7 @@ public <T> FieldWriter<T> createFieldWriter(
904904
return new FieldWriterStringMethod(fieldName, ordinal, format, label, features, field, method);
905905
}
906906

907-
if (fieldClass == List.class) {
907+
if (fieldClass == List.class || fieldClass == ArrayList.class || fieldClass == Iterable.class) {
908908
Type itemType;
909909
if (fieldType instanceof ParameterizedType) {
910910
itemType = ((ParameterizedType) fieldType).getActualTypeArguments()[0];
@@ -1086,7 +1086,7 @@ public <T, V> FieldWriter<T> createFieldWriter(
10861086
Type rawType = parameterizedType.getRawType();
10871087
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
10881088

1089-
if (rawType == List.class || rawType == ArrayList.class) {
1089+
if (rawType == List.class || rawType == ArrayList.class || rawType == Iterable.class) {
10901090
if (actualTypeArguments.length == 1) {
10911091
Type itemType = actualTypeArguments[0];
10921092
if (itemType == String.class) {

core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterImplList.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public void writeArrayMappingJSONB(JSONWriter jsonWriter, Object object, Object
6767
return;
6868
}
6969

70-
List list = (List) object;
70+
List list = toList(object);
7171
Class previousClass = null;
7272
ObjectWriter previousObjectWriter = null;
7373

@@ -131,7 +131,7 @@ public void writeJSONB(JSONWriter jsonWriter, Object object, Object fieldName, T
131131
}
132132
}
133133

134-
List list = (List) object;
134+
List list = toList(object);
135135
Class previousClass = null;
136136
ObjectWriter previousObjectWriter = null;
137137

@@ -238,8 +238,7 @@ public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type f
238238
return;
239239
}
240240

241-
List list = (List) object;
242-
241+
List list = toList(object);
243242
Class previousClass = null;
244243
ObjectWriter previousObjectWriter = null;
245244
boolean previousRefDetect = true;

core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterImplListEnum.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import java.lang.reflect.Type;
77
import java.util.List;
88

9+
import static com.alibaba.fastjson2.util.TypeUtils.toList;
10+
911
final class ObjectWriterImplListEnum
1012
extends ObjectWriterPrimitiveImpl {
1113
final Class defineClass;
@@ -32,7 +34,7 @@ public void writeJSONB(JSONWriter jsonWriter, Object object, Object fieldName, T
3234
jsonWriter.writeTypeName(TypeUtils.getTypeName(objectClass));
3335
}
3436

35-
List list = (List) object;
37+
List list = toList(object);
3638

3739
int size = list.size();
3840
jsonWriter.startArray(size);
@@ -69,7 +71,7 @@ public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type f
6971
return;
7072
}
7173

72-
List list = (List) object;
74+
List list = toList(object);
7375

7476
jsonWriter.startArray();
7577
for (int i = 0; i < list.size(); i++) {

core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterImplListStr.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.ArrayList;
99
import java.util.List;
1010

11+
import static com.alibaba.fastjson2.util.TypeUtils.toList;
1112
import static com.alibaba.fastjson2.writer.ObjectWriterImplList.CLASS_SUBLIST;
1213

1314
final class ObjectWriterImplListStr
@@ -21,7 +22,7 @@ public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type f
2122
return;
2223
}
2324

24-
List list = (List) object;
25+
List list = toList(object);
2526

2627
jsonWriter.startArray();
2728
for (int i = 0; i < list.size(); i++) {
@@ -68,7 +69,7 @@ public void writeJSONB(JSONWriter jsonWriter, Object object, Object fieldName, T
6869
);
6970
}
7071

71-
List<String> list = (List) object;
72+
List<String> list = toList(object);
7273
jsonWriter.writeString(list);
7374
}
7475
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.alibaba.fastjson2.issues_1500;
2+
3+
import com.alibaba.fastjson2.JSON;
4+
import org.junit.Test;
5+
6+
import java.util.ArrayList;
7+
import java.util.Iterator;
8+
import java.util.List;
9+
10+
import static org.junit.Assert.assertEquals;
11+
12+
public class Issue1563 {
13+
@Test
14+
public void test() {
15+
List<List<Object>> data = new ArrayList<>();
16+
List<String> strData = new ArrayList<>();
17+
for (int i = 0; i < 2; i++) {
18+
List<Object> row = new ArrayList<>();
19+
for (int j = 0; j < 2; j++) {
20+
String str = "i_" + i + "_j_" + j;
21+
row.add(str);
22+
strData.add(str);
23+
}
24+
data.add(row);
25+
}
26+
MyData myData = new MyData(data, strData);
27+
assertEquals("{\"data\":[[\"i_0_j_0\",\"i_0_j_1\"],[\"i_1_j_0\",\"i_1_j_1\"]],\"strData\":[\"i_0_j_0\",\"i_0_j_1\",\"i_1_j_0\",\"i_1_j_1\"]}",
28+
JSON.toJSONString(myData));
29+
}
30+
31+
public static class MyData {
32+
private final List<List<Object>> list;
33+
private final List<String> strList;
34+
35+
public MyData(List<List<Object>> list, List<String> strList) {
36+
this.list = list;
37+
this.strList = strList;
38+
}
39+
40+
public Iterable<Object> getData() {
41+
Iterator<List<Object>> it = list.iterator();
42+
return () -> new Iterator<Object>() {
43+
@Override
44+
public boolean hasNext() {
45+
return it.hasNext();
46+
}
47+
48+
@Override
49+
public Object next() {
50+
return it.next();
51+
}
52+
};
53+
}
54+
55+
public Iterable<String> getStrData() {
56+
Iterator<String> it = strList.iterator();
57+
return () -> new Iterator<String>() {
58+
@Override
59+
public boolean hasNext() {
60+
return it.hasNext();
61+
}
62+
63+
@Override
64+
public String next() {
65+
return it.next();
66+
}
67+
};
68+
}
69+
}
70+
}

0 commit comments

Comments
 (0)