gpt4 book ai didi

Java:根据JSON属性id值将JSON数组反序列化为Map

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:37 25 4
gpt4 key购买 nike

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

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize >instance of java.util.LinkedHashMap out of START_ARRAY token at [Source: (BufferedInputStream); line: 1, column: 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);

但这种做法并不令我满意。

非常感谢任何帮助。

问候。

最佳答案

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

您必须更改 JSON 结构以容纳 Key=>Value 的数组配对或转换列表以映射您在编辑中所做的方式。

关于Java:根据JSON属性id值将JSON数组反序列化为Map<Integer, Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47539657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com