Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions core/src/main/java/com/alibaba/fastjson2/util/TypeUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -4083,4 +4083,20 @@ public static Type getMapValueType(Type fieldType) {
}
return Object.class;
}

public static List toList(Object object) {
if (object == null) {
return null;
} else if (object instanceof List) {
return (List) object;
} else if (object instanceof Iterable) {
List list = new ArrayList();
for (Object item : (Iterable) object) {
list.add(item);
}
return list;
} else {
throw new JSONException("Can not cast '" + object.getClass() + "' to List");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.List;

import static com.alibaba.fastjson2.JSONWriter.Feature.*;
import static com.alibaba.fastjson2.util.TypeUtils.toList;

final class FieldWriterListFunc<T>
extends FieldWriterList<T> {
Expand Down Expand Up @@ -39,7 +40,7 @@ public Object getFieldValue(T object) {
public boolean write(JSONWriter jsonWriter, T object) {
List value;
try {
value = function.apply(object);
value = toList(function.apply(object));
} catch (RuntimeException error) {
if (jsonWriter.isIgnoreErrorGetter()) {
return false;
Expand Down Expand Up @@ -80,7 +81,7 @@ public boolean write(JSONWriter jsonWriter, T object) {

@Override
public void writeValue(JSONWriter jsonWriter, T object) {
List list = function.apply(object);
List list = toList(function.apply(object));
if (list == null) {
jsonWriter.writeNull();
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.util.List;

import static com.alibaba.fastjson2.JSONWriter.Feature.*;
import static com.alibaba.fastjson2.util.TypeUtils.toList;

final class FieldWriterListMethod<T>
extends FieldWriterList<T> {
Expand Down Expand Up @@ -42,7 +43,7 @@ public Object getFieldValue(Object object) {
public boolean write(JSONWriter jsonWriter, T object) {
List value;
try {
value = (List) getFieldValue(object);
value = toList(getFieldValue(object));
} catch (JSONException error) {
if (jsonWriter.isIgnoreErrorGetter()) {
return false;
Expand Down Expand Up @@ -87,7 +88,7 @@ public boolean write(JSONWriter jsonWriter, T object) {

@Override
public void writeValue(JSONWriter jsonWriter, T object) {
List value = (List) getFieldValue(object);
List value = toList(getFieldValue(object));

if (value == null) {
jsonWriter.writeNull();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.List;

import static com.alibaba.fastjson2.JSONWriter.Feature.*;
import static com.alibaba.fastjson2.util.TypeUtils.toList;

final class FieldWriterListStrFunc<T>
extends FieldWriter<T> {
Expand Down Expand Up @@ -37,7 +38,7 @@ public Object getFieldValue(T object) {
public boolean write(JSONWriter jsonWriter, T object) {
List list;
try {
list = function.apply(object);
list = toList(function.apply(object));
} catch (RuntimeException error) {
if (jsonWriter.isIgnoreErrorGetter()) {
return false;
Expand Down Expand Up @@ -97,7 +98,7 @@ public boolean write(JSONWriter jsonWriter, T object) {

@Override
public void writeValue(JSONWriter jsonWriter, T object) {
List list = function.apply(object);
List list = toList(function.apply(object));
if (list == null) {
jsonWriter.writeNull();
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -729,7 +729,7 @@ public <T> FieldWriter<T> createFieldWriter(
}
}

if (fieldClass == List.class || fieldClass == ArrayList.class) {
if (fieldClass == List.class || fieldClass == ArrayList.class || fieldClass == Iterable.class) {
Type itemType = null;
if (fieldType instanceof ParameterizedType) {
itemType = ((ParameterizedType) fieldType).getActualTypeArguments()[0];
Expand Down Expand Up @@ -893,7 +893,7 @@ public <T> FieldWriter<T> createFieldWriter(
return new FieldWriterStringMethod(fieldName, ordinal, format, label, features, field, method);
}

if (fieldClass == List.class) {
if (fieldClass == List.class || fieldClass == ArrayList.class || fieldClass == Iterable.class) {
Type itemType;
if (fieldType instanceof ParameterizedType) {
itemType = ((ParameterizedType) fieldType).getActualTypeArguments()[0];
Expand Down Expand Up @@ -1075,7 +1075,7 @@ public <T, V> FieldWriter<T> createFieldWriter(
Type rawType = parameterizedType.getRawType();
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();

if (rawType == List.class || rawType == ArrayList.class) {
if (rawType == List.class || rawType == ArrayList.class || rawType == Iterable.class) {
if (actualTypeArguments.length == 1) {
Type itemType = actualTypeArguments[0];
if (itemType == String.class) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

import static com.alibaba.fastjson2.JSONB.Constants.BC_ARRAY_FIX_0;
import static com.alibaba.fastjson2.JSONFactory.getClassJSONArray1x;
import static com.alibaba.fastjson2.util.TypeUtils.*;
import static com.alibaba.fastjson2.util.TypeUtils.toList;

final class ObjectWriterImplList
extends ObjectWriterPrimitiveImpl {
Expand Down Expand Up @@ -67,7 +67,7 @@ public void writeArrayMappingJSONB(JSONWriter jsonWriter, Object object, Object
return;
}

List list = (List) object;
List list = toList(object);
Class previousClass = null;
ObjectWriter previousObjectWriter = null;

Expand Down Expand Up @@ -131,7 +131,7 @@ public void writeJSONB(JSONWriter jsonWriter, Object object, Object fieldName, T
}
}

List list = (List) object;
List list = toList(object);
Class previousClass = null;
ObjectWriter previousObjectWriter = null;

Expand Down Expand Up @@ -238,8 +238,7 @@ public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type f
return;
}

List list = (List) object;

List list = toList(object);
Class previousClass = null;
ObjectWriter previousObjectWriter = null;
boolean previousRefDetect = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import java.lang.reflect.Type;
import java.util.List;

import static com.alibaba.fastjson2.util.TypeUtils.toList;

final class ObjectWriterImplListEnum
extends ObjectWriterPrimitiveImpl {
final Class defineClass;
Expand All @@ -32,7 +34,7 @@ public void writeJSONB(JSONWriter jsonWriter, Object object, Object fieldName, T
jsonWriter.writeTypeName(TypeUtils.getTypeName(objectClass));
}

List list = (List) object;
List list = toList(object);

int size = list.size();
jsonWriter.startArray(size);
Expand Down Expand Up @@ -69,7 +71,7 @@ public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type f
return;
}

List list = (List) object;
List list = toList(object);

jsonWriter.startArray();
for (int i = 0; i < list.size(); i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.ArrayList;
import java.util.List;

import static com.alibaba.fastjson2.util.TypeUtils.toList;
import static com.alibaba.fastjson2.writer.ObjectWriterImplList.CLASS_SUBLIST;

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

List list = (List) object;
List list = toList(object);

jsonWriter.startArray();
for (int i = 0; i < list.size(); i++) {
Expand Down Expand Up @@ -68,7 +69,7 @@ public void writeJSONB(JSONWriter jsonWriter, Object object, Object fieldName, T
);
}

List<String> list = (List) object;
List<String> list = toList(object);
jsonWriter.writeString(list);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.alibaba.fastjson2.issues_1500;

import com.alibaba.fastjson2.JSON;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import static org.junit.Assert.assertEquals;

public class Issue1563 {
@Test
public void test() {
List<List<Object>> data = new ArrayList<>();
List<String> strData = new ArrayList<>();
for (int i = 0; i < 2; i++) {
List<Object> row = new ArrayList<>();
for (int j = 0; j < 2; j++) {
String str = "i_" + i + "_j_" + j;
row.add(str);
strData.add(str);
}
data.add(row);
}
MyData myData = new MyData(data, strData);
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\"]}",
JSON.toJSONString(myData));
}

public static class MyData {
private final List<List<Object>> list;
private final List<String> strList;

public MyData(List<List<Object>> list, List<String> strList) {
this.list = list;
this.strList = strList;
}

public Iterable<Object> getData() {
Iterator<List<Object>> it = list.iterator();
return () -> new Iterator<Object>() {
@Override
public boolean hasNext() {
return it.hasNext();
}

@Override
public Object next() {
return it.next();
}
};
}

public Iterable<String> getStrData() {
Iterator<String> it = strList.iterator();
return () -> new Iterator<String>() {
@Override
public boolean hasNext() {
return it.hasNext();
}

@Override
public String next() {
return it.next();
}
};
}
}
}
Loading