【发布时间】:2019-03-31 15:04:42
【问题描述】:
使用 Java 8。我想创建一个通用函数,可用于将 JSONArray 对象的内容映射到某个类。该函数的输入将是一个JSONArray 和一个类对象,该对象具有一个构造函数,该构造函数将JSONArray 中的单个JSONObjects 转换为适当的POJO。
我想要这样的东西:
public static List<T> getObjectsFromJSONArray(Class T, JSONArray input) {
return IntStream.range(0, input.length())
.mapToObj(index -> (JSONObject)input.get(index))
.collect(Collectors.toList())
.forEach(jsonObj -> new T(jsonObj));
}
这不会编译。也许是因为我是 Java 新手并且不习惯它,所以我想让它成为一个通用函数。
一种可能的替代解决方案是创建一个类U<T>,它扩展List 并作为List<T> 用于所有意图和目的。 U 的构造函数将采用整个 JSONArray,然后我的代码使用指定的类型。我以前见过这种实现,但对我来说似乎很麻烦。让我知道一个新类 U 是否确实是在 Java 中执行此操作的“最佳实践”方式。
【问题讨论】:
-
如果可能的话,你可以使用一个库来帮助你解决这个问题,例如 gson,stackoverflow.com/questions/19133944/… 这里他们解决了类似的问题
-
了解类型擦除。 “新T”根本不可能。是的:使用像 Jackson 或 gson 这样的框架,而不是重新发明轮子。
-
@kingledion 我用的是Jackson(因为我用的是spring boot,它默认使用Jackson),我从来没有遇到过这种问题。你到底尝试了什么?顺便说一句,我强烈推荐 Spring Boot,与许多其他很棒的功能一样,它会自动从 HTTP 调用中序列化/反序列化,就像零 json 相关代码一样:您只需声明一个返回/接受(在您的情况下)列表的方法嘿,你已经完成了。
-
@kingledion 使用 jackson 将字符串反序列化为
List<T>很简单;那对你有用吗?你真的需要使用 JSONObjects 吗? -
除了不可能做到
new T(...)之外,.forEach(jsonObj -> new T(jsonObj))还能做什么?