【发布时间】:2017-11-28 19:41:44
【问题描述】:
首先:我知道有一些关于 json 数组反序列化的主题,但我仍然不知道如何使用 Jackson 存储/反序列化如下所示的 JSON 数组Map
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);
但这种方法并不能让我满意。
非常感谢任何帮助。
问候。
【问题讨论】: