【问题标题】:Java: Deserialise JSON Array to Map<Integer, Object> according to JSON property id valueJava:根据 JSON 属性 id 值将 JSON Array 反序列化为 Map<Integer, Object>
【发布时间】:2017-11-28 19:41:44
【问题描述】:

首先:我知道有一些关于 json 数组反序列化的主题,但我仍然不知道如何使用 Jackson 存储/反序列化如下所示的 JSON 数组Map,所以我可以通过 JSON 文件中的 ID 整数属性访问 Map。例如songStore.get(2) ,其中“2”是映射键,并与 ID 为 2 的 Json 条目匹配。我尝试了不同的方法,但我卡在错误消息中:

com.fasterxml.jackson.databind.exc.MismatchedInputException: 无法反序列化 >java.util.LinkedHashMap 的实例超出 START_ARRAY 令牌 在 [来源:(BufferedInputStream);行:1,列:1]

如果我把它写到 List 中,它可以工作,但这不是我需要的。

[
    {
        "id": 1,
        "title": "Title 1",
        "artist": "Artist 1",
        "released": 2012
    },
    {
        "id": 2,
        "title": "Title 2",
        "artist": "Artist 2",
        "album": "Album 2",
        "released": 2014
    },
    {
        "id": 3,
        "title": "Title 3",
        "artist": "Artist 3",
        "album": "Album 3",
        "released": 2016
    },
    {...}
]

我的 POJO 看起来像这样:

公开课歌{

@JsonProperty("id")
private Integer id;

@JsonProperty("title")
private String title;

@JsonProperty("artist")
private String artist;

@JsonProperty("album")
private String album;

@JsonProperty("released")
private Integer released;

public Song () {    }

public Song (Integer id, String title, String artist, String album, Integer released) {
    this.id = id;
    this.title = title;
    this.artist = artist;
    this.album = album;
    this.released = released;
}

public Integer getId() {
    return id;
}

void setId(Integer id) {
    this.id = id;
}

public String getTitle() {
    return title;
}

public String getArtist() {
    return artist;
}

public String getAlbum() {
    return album;
}

public Integer getReleased() {
    return released;
}

}

这是我的方法,但我无法让它发挥作用:

// Reads a list of songs from a JSON-file into Map<Integer, Song>
@SuppressWarnings("unchecked")
static Map<Integer, Song> readJSONToSongsMap (String filename) throws FileNotFoundException, IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    try (InputStream is = new BufferedInputStream(new FileInputStream(filename))) {
        return (Map<Integer, Song>) objectMapper.readValue(is, new TypeReference<Map<Integer, Song>>(){});
    }
}

编辑:我通过创建一个列表找到了解决方法:

@SuppressWarnings("unchecked")
static List<Song> readJSONToSongs (String filename) throws FileNotFoundException, IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    try (InputStream is = new BufferedInputStream(new FileInputStream(filename))) {
        return (List<Song>) objectMapper.readValue(is,  new TypeReference<List<Song>>(){});
    }
}

然后只需通过以下方式将 List 转换为 Hashmap:

private Map<Integer, Song> songStore = new HashMap<Integer, Song>();
List<Song> readSongs = readJSONToSongs("songs.json");

//convert from list to hashmap with key=getId and value=Song.class object
for(Song i : readSongs) songStore.put(i.getId(),i);

但这种方法并不能让我满意。

非常感谢任何帮助。

问候。

【问题讨论】:

    标签: java arrays json hashmap


    【解决方案1】:

    使用给定的 JSON 结构和您的 POJO 类,您无法将 JSON blob 序列化为 Map&lt;Integer, Song&gt;,因为 JSON 本身是 Song 对象的列表表示形式。

    您必须更改 JSON 结构以容纳 Key=&gt;Value 对的数组,或者转换列表以映射您在编辑中已经执行的方式。

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 2020-02-19
      • 2012-08-19
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2021-06-14
      • 2021-01-26
      • 2016-11-21
      相关资源
      最近更新 更多