我有一个带有以下签名的方法:
// Converts a json string to a list of objects
// Assumption: json is an array, and all items in the list are of the same type
public <T> List<T> getListFromJson( String json, Class<T> itemType, List<T> defValue ) {
final ArrayList<T> list = new ArrayList<T>();
for( JsonElement e : parser.parse(json).getAsJsonArray())
list.add( (T) (
Number.class.isAssignableFrom(itemType) ? e.getAsNumber() :
Boolean.class.isAssignableFrom(itemType) ? e.getAsBoolean() :
Character.class.isAssignableFrom(itemType) ? e.getAsCharacter() :
String.class.isAssignableFrom(itemType) ? e.getAsString() :
JsonElement.class.isAssignableFrom(itemType) ? e :
null
)
);
return list;
}
它读取json字符串并将其转换为适当类型的对象列表,例如Integer,String等。
是否有一种强大的方法可以通过从List 参数中推断出Class 参数来从方法中删除Class 参数?例如,我是否可以更改方法签名为以下内容而不失去功能?
public <T> List<T> getListFromJson( String json, List<T> defValue ) {
...
}
看起来解决方案需要对ParameterizedType进行一些高级操作。我查看了以下内容,但是要么我使用这些方法不正确,要么它们没有做到我的期望:
- http://www.artima.com/weblogs/viewpost.jsp?thread=208860中的getTypeArguments()
- https://code.google.com/p/aphillips/source/browse/commons-lang/trunk/src/main/java/com/qrmedia/commons/lang/ClassUtils.java中的getActualTypeArguments()
class Wrapper { List<Wrapped> list;}
和另一个class Wrapped { int onlyField;}
,它将会把一个Wrapper
对象的 JSON 字符串表示反序列化为正确的对象类型。 - Arya Pourtabatabaieclass Wrapper<T> { List<T> list; }
的示例之间的区别。 - Mark Peters