【问题标题】:Java ArrayList<String> form comma-separated strings in square bracketsJava ArrayList<String> 来自方括号中的逗号分隔字符串
【发布时间】:2021-05-16 09:33:52
【问题描述】:

我正在调用一个端点,我得到的请求正文如下所示。

{"page":6,"name":"Fly","myList":["123","657","983","112"]}

所以我正在创建一个 org.json.JSONObject,例如 JSONObject repsonseObj = new JSONObject(repsonse.getBody());

我现在可以做

(int)repsonseObj.get("page");
(String)repsonseObj.get("name");

我试图将 "myList" 转换为 Java ArrayList of String。 我可以使用 JSONArray 对象将其拉出并使用 for 循环来填充 ArrayList 的实例。 还尝试使用 ObjectMapper for jackson.databind 进行类似下面的操作

    myListVar = mapper.readValue((String)repsonse.getString("myList"), new TypeReference<ArrayList<String>>(){}); 
//That gives an error saying "myList" is not a string. Surely I am missing something here.

我想保持数字的顺序。 有没有更优雅的解决方案?我尝试查看 java.lang 中的 StringUtilsArrayUtils。我似乎无法找到更好的解决方案。有人能指出我正确的方向吗,谢谢。

【问题讨论】:

  • 我认为这个Is there a more elegant solution for this? 问题是基于意见的。

标签: java json spring arraylist httpresponse


【解决方案1】:

其实你为什么不解析整个对象而不仅仅是列表呢?

public class MyClass {
    private Integer page;
    private String name;
    private List<String> myList;

    //getters, setters
}

这会将 JSON 解析为一个变量

MyClass myClass = objectMapper.readValue("{\"page\":6,\"name\":\"Fly\",\"myList\":[\"123\",\"657\",\"983\",\"112\"]}", MyClass.class);

编辑:

在 cmets 中证明,您需要 JSON 中的属性具有与您的类中不同的名称。这可以通过使用@Dragos Ionut 建议的@JsonProperty 注释类属性来轻松实现。只需执行以下操作

import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.List;

public class MyClass {
    @JsonProperty("page")
    private Integer otherNameThanPage;
    @JsonProperty("name")
    private String otherNameThanName;
    @JsonProperty("myList")
    private List<String> otherNameThanMyList;


    //getters, setters
}

【讨论】:

  • 绝对是更好的选择:Jackson 将在此处通过反射检测列表类型。我一直不明白为什么开发人员会尽量避免创建类 :-)。
  • 实际上,我总是将我的 REST API 设计为包含作为对象(而不是数组)的根元素。向其中添加数据更容易(例如分页),您不必同时部署客户端,因为 API 仍在工作
  • 我实际上是在使用一个类将数据发送到客户端进行分页。但是,微服务端的请求 POJO 与调用应用程序中的 POJO 具有不同的名称和字段。映射将不匹配。所以我试图在发送到 JSP 之前手动将请求值映射到 POJO。
  • 为什么不在这种情况下注释字段以匹配您的 json.Something 像这样:@JsonProperty("strVal")
  • @DragosIonut 我认为这也是正确的解决方案,我相应地编辑了我的答案:)
【解决方案2】:

这是序列化整个对象的好方法,你已经得到了答案。


OR

你可以这样尝试

String json = (String)repsonse.getString("myList");
String[] array = objectMapper.readValue(json, new TypeReference<String[]>() {});

已编辑:我添加了@aBnormaLz 的建议,结果相同。

String json = (String)repsonse.getString("myList");
String[] array = objectMapper.readValue(json, String[].class);

【讨论】:

  • 其实在这种情况下你可以这样做objectMapper.readValue(json, String[].class);
  • 我看到你编辑了你的答案,第二个代码有一个Unchecked assignment 警告
  • 我在你的建议中添加了。 @aBnormaLz
猜你喜欢
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 2011-10-01
  • 2017-04-17
  • 2013-02-13
  • 1970-01-01
相关资源
最近更新 更多