【问题标题】:A Java function to map the contents of a JSONArray to a given class?将 JSONArray 的内容映射到给定类的 Java 函数?
【发布时间】: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&lt;T&gt;,它扩展List 并作为List&lt;T&gt; 用于所有意图和目的。 U 的构造函数将采用整个 JSONArray,然后我的代码使用指定的类型。我以前见过这种实现,但对我来说似乎很麻烦。让我知道一个新类 U 是否确实是在 Java 中执行此操作的“最佳实践”方式。

【问题讨论】:

  • 如果可能的话,你可以使用一个库来帮助你解决这个问题,例如 gson,stackoverflow.com/questions/19133944/… 这里他们解决了类似的问题
  • 了解类型擦除。 “新T”根本不可能。是的:使用像 Jackson 或 gson 这样的框架,而不是重新发明轮子。
  • @kingledion 我用的是Jackson(因为我用的是spring boot,它默认使用Jackson),我从来没有遇到过这种问题。你到底尝试了什么?顺便说一句,我强烈推荐 Spring Boot,与许多其他很棒的功能一样,它会自动从 HTTP 调用中序列化/反序列化,就像零 json 相关代码一样:您只需声明一个返回/接受(在您的情况下)列表的方法嘿,你已经完成了。
  • @kingledion 使用 jackson 将字符串反序列化为 List&lt;T&gt; 很简单;那对你有用吗?你真的需要使用 JSONObjects 吗?
  • 除了不可能做到new T(...)之外,.forEach(jsonObj -&gt; new T(jsonObj))还能做什么?

标签: java json generics java-8


【解决方案1】:

怎么样

   public static <T> List<T> getObjectsFromJSONArray(Function<JSONObject, T> factory, JSONArray input) {
    return IntStream.range(0, input.length())
      .mapToObj(index -> factory.apply((JSONObject)input.get(index)))
      .collect(Collectors.toList());
  }

然后你像这样使用它

getObjectsFromJSONArray(YourObject::new, jsonarray)

【讨论】:

  • 这并不完全是 op 想要的,在 OP 的示例中,他循环遍历 json 数组的每个条目,您只需尝试投射它
  • 这太好了,谢谢。我不熟悉返回值之前的&lt;T&gt; 符号?那叫什么?我在哪里可以了解这一点?
  • @kingledion 这是一个类型参数。既然你自己用[generics] 标记了你的问题,你应该听说过。
  • @kingledion 你可以阅读泛型的基础知识,例如这里:baeldung.com/java-generics
猜你喜欢
  • 2020-05-16
  • 2018-01-06
  • 2015-12-03
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多