【问题标题】:JSON to List<T> [duplicate]JSON to List<T> [重复]
【发布时间】:2018-02-13 19:43:43
【问题描述】:

我是新来的,遇到了问题,惊喜:D

我有一个 JSON 字符串,我想把它转换成一个列表。

我的 JSON 字符串:

{
"results": [
    {
        "uri": "http://xxxxxx",
        "downloadCount": 0,
        "lastDownloaded": "2017-04-10T16:12:47.438+02:00",
        "remoteDownloadCount": 0,
        "remoteLastDownloaded": "1970-01-01T01:00:00.000+01:00"
    },
    {
        "uri": "http://yyyyyyy",
        "downloadCount": 0,
        "lastDownloaded": "2017-04-10T16:12:47.560+02:00",
        "remoteDownloadCount": 0,
        "remoteLastDownloaded": "1970-01-01T01:00:00.000+01:00"
    },]}

如何在 Java 中转换它?

编辑: 我的问题是“结果”根元素...... this 工作正常。

【问题讨论】:

  • 不能转成列表。 JSON 是一个带有 results 字段的对象,它保存了一个结果对象列表。
  • 在 Java 中处理 JSON 数据的最简单方法是使用现有的优秀 Java 库之一,如 Jackson 来操作 JSON 数据。
  • 当您遇到问题时,请先 google,然后再在 SO 上发布问题。正如@jtahlborn 所说,有像 Jackson、GSON 这样的优秀图书馆。
  • stackoverflow.com/questions/30594660/… 这对我有用:ObjectReader objectReader = objectMapper.reader(new TypeReference&lt;List&lt;artifact&gt;&gt;(){}).withRootName("results"); List&lt;artifact&gt; artifactList = objectReader.readValue(jsonString);

标签: java json list


【解决方案1】:

创建一个用于访问数据的类。

class ListElement {
    public String uri;
    public int downloadCount;
    public String lastDownloaded;
    public int remoteDownloadCount;
    public String remoteLastDownloaded;
}

然后,解析 json 并获取列表并将其转换为列表。

public static void main(String[] args) throws ParseException {
    Gson gson = new Gson();
    JsonElement list = new JsonParser().parse(json).getAsJsonObject().get("results");
    List<ListElement> listObj = gson.fromJson(list, new TypeToken<List<ListElement>>() {}.getType());
    System.out.println(listObj.size());
}

请注意,我使用 String 而不是 ZonedDateTime。因为,它是 JsonObject 的字符串(用引号括起来)。

【讨论】:

    【解决方案2】:

    首先,您需要创建一个与 JSON 中的模型匹配的 Java 模型对象,例如:

    public class MyClass {
        private String uri;
        private int downloadCount;
        private ZonedDateTime lastDownloaded;
        private int remoteDownloadCount;
        private ZonedDateTime remoteLastDownloaded;
    
       (getters and setters)
    
    }
    

    然后您可以使用像 Jackson (https://github.com/FasterXML/jackson) 这样的 JSON 解析器,使用 Jackson ObjectMapper 类 (https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/ObjectMapper.html) 将您的 JSON 解析为该对象的实例列表:

    ObjectMapper objectMapper = new ObjectMapper();
    MyClass[] myClasses = objectMapper.readValue(jsonString, MyClass[].class);
    

    【讨论】:

    • 我之前试过,我得到这个错误:线程“主”com.fasterxml.jackson.databind.JsonMappingException 中的异常:无法反序列化 de.vsa.resttest.artifact[] 的实例[来源:java.io.StringReader@351d0846;START_OBJECT 令牌;行:1,列:1]
    • 我认为您的 JSON 格式不正确。最后一个逗号不应该在那里
    • @Juli ObjectMapper 不会直接将字符串转换为 ZonedDateTime。您可以将lastDownloaded 和remoteLastDownloaded 的数据类型设为字符串以避免JsonMappingException。请参考我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多