字符串转List对象,特别时List<Map<K, V>>这种带泛型的类型时,希望在转换时可以明确指定泛型类型的解决方法。
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.example.demo.DemoDTO;
/**
* Description
*/
public class JsonStringToListTest {
@Test
public void doTest() {
String s = "[{'id':1234},{'id':1234},{'id':1234}]";
System.out.println("string: "+s);
// 可以获取到类型匹配的对象
Type listType = new TypeReference<List<Map<String, Long>>>() {}.getType();
List<Map<String, Long>> list = JSON.parseObject(s, listType);
System.out.println(list);
// 此方法只能获取到的元素是 JSONObject对象包装的Map
list = parseJson(s);
System.out.println(list);
// 下面的方法无法正常运行,会报错
// list = JSON.parseObject(s, new ArrayList<Map<String, Long>>(){}.getClass());
// System.out.println(list);
// 注意必须加,{}否则元素还是JSONObject对象
list = new JsonHelper<List<Map<String, Long>>>(){}.parseJson(s);
System.out.println(list);
// 其他方法
System.out.println("----");
List<HashMap> list2 = JSON.parseArray(s, HashMap.class);
System.out.println(list2);
List<DemoDTO> list3 = JSON.parseArray(s, DemoDTO.class);
System.out.println(list3);
}
public <T> T parseJson(String jsonString) {
Type listType = new TypeReference<T>() {}.getType();
return JSON.parseObject(jsonString, listType);
}
private class JsonHelper<T> extends TypeReference<T> {
public T parseJson(String jsonString) {
return JSON.parseObject(jsonString, super.getType());
}
}
}
输出内如如下
string: [{'id':1234},{'id':1234},{'id':1234}]
[{id=1234}, {id=1234}, {id=1234}]
[{"id":1234},{"id":1234},{"id":1234}]
[{id=1234}, {id=1234}, {id=1234}]
----
[{id=1234}, {id=1234}, {id=1234}]
[DemoDTO(id=1234, projectId=null), DemoDTO(id=1234, projectId=null), DemoDTO(id=1234, projectId=null)]