Java 在Hashmap中使用带有ArrayList的JsonAnySetter和JsonAnyGetter
所以我正试图用Jackson注释来让我的头脑清醒过来,我正在对Riot的API发出请求。这是我得到的答复:。其中,召唤ID(38584682)后面的数组可以具有不同的长度 唯一的召唤者ID每次都会不同 我想将此响应映射到DTO 对于类似情况,我正在进行不同的呼叫:Java 在Hashmap中使用带有ArrayList的JsonAnySetter和JsonAnyGetter,java,json,jackson,Java,Json,Jackson,所以我正试图用Jackson注释来让我的头脑清醒过来,我正在对Riot的API发出请求。这是我得到的答复:。其中,召唤ID(38584682)后面的数组可以具有不同的长度 唯一的召唤者ID每次都会不同 我想将此响应映射到DTO 对于类似情况,我正在进行不同的呼叫: @JsonIgnore protected Map<String, SingleSummonerBasicDTO> nonMappedAttributes; @JsonAnyGetter public Map<St
@JsonIgnore
protected Map<String, SingleSummonerBasicDTO> nonMappedAttributes;
@JsonAnyGetter
public Map<String, SingleSummonerBasicDTO> getNonMappedAttributes() {
return nonMappedAttributes;
}
@JsonAnySetter
public void setNonMappedAttributes(String key, SingleSummonerBasicDTO value) {
if (nonMappedAttributes == null) {
nonMappedAttributes = new HashMap<String, SingleSummonerBasicDTO>();
}
if (key != null) {
if (value != null) {
nonMappedAttributes.put(key, value);
} else {
nonMappedAttributes.remove(key);
}
}
}
@JsonIgnore
受保护的地图非地图属性;
@JsonAnyGetter
公共地图getNonMappedAttributes(){
退还不可上诉的贡品;
}
@JSONANYSETER
public void setNonmappedAttribute(字符串键,SingleCallerBasicdTo值){
if(非映射属性==null){
nonMappedAttributes=新HashMap();
}
if(key!=null){
if(值!=null){
非上限属性。put(键,值);
}否则{
非映射属性。移除(键);
}
}
}
从这里开始回答。我的想法是为数组中的每个元素执行for-each循环,但我不知道如何在没有循环的情况下循环某些内容
我完全无法理解注释是如何工作的,以及如何进行,如果有任何帮助,我将不胜感激 首先,
@JsonAnySetter
旨在处理不同属性的情况,而不是处理不同长度的json数组
Jackson能够在序列化和反序列化中使用Java集合和映射。您只需告诉它集合的参数类型
在您的例子中,我使用了映射
来捕获根元素,使其成为唯一的键,并将dto的列表
作为值。我使用Jackson的类型系统(和)告诉Jackson所有的泛型类型
这是我使用的DTO:
public class SingleSummonerBasicDTO
{
public String name;
public String tier;
public String queue;
public List<SingleSummonerBasicDTOEntry> entries;
@Override
public String toString() {
String toString = "\nSingleSummonerBasicDTO: " + name + " " + tier + " " + queue;
for (SingleSummonerBasicDTOEntry entry : entries) {
toString += "\n" + entry.toString();
}
return toString;
}
public static class SingleSummonerBasicDTOEntry
{
public String playerOrTeamId;
public String playerOrTeamName;
public String division;
public int leaguePoints;
public int wins;
public int losses;
public boolean isHotStreak;
public boolean isVeteran;
public boolean isFreshBlood;
public boolean isInactive;
@Override
public String toString() {
return "Entry: " + playerOrTeamId + " " + playerOrTeamName + " " + division + " " + leaguePoints + " " + wins + " " +
losses + " " + isHotStreak + " " + isVeteran + " " + isInactive;
}
}
以下是解析json的方法:
Map<String, List<SingleSummonerBasicDTO>> summonersMap = new ObjectMapper()
.readValue(json, new TypeReference<HashMap<String, List<SingleSummonerBasicDTO>>>() {});
Map-callersmap=new-ObjectMapper()
.readValue(json,新类型引用(){});
你能补充一点解释吗?这出现在评论队列中。这太棒了,谢谢!但是,我想知道是什么将DTO的JavaType结构传递到#readValue方法中,而不是仅仅传递DTO.class?谢谢。JavaType允许指定泛型类型。好的,很酷!非常感谢,我将DTO更改为使用映射,并使用了您的反序列化代码,效果很好。但是,我必须将constructMapLikeType更改为constructMapType,并将constructCollectionLikeType更改为constructMapType。
{38584682=[
SingleSummonerBasicDTO: Viktor's Masterminds PLATINUM RANKED_SOLO_5x5
Entry: 38584682 Lazrkiller V 64 291 295 false true false,
SingleSummonerBasicDTO: Renekton's Horde SILVER RANKED_TEAM_5x5
Entry: TEAM-ff7d0db0-78ca-11e4-b402-c81f66dba0e7 Y U NO BABAR II 0 4 2 false false false,
SingleSummonerBasicDTO: Pantheon's Chosen SILVER RANKED_TEAM_5x5
Entry: TEAM-d32018f0-d998-11e4-bfd2-c81f66dba0e7 Lose and Throw Away I 66 7 0 false false false,
SingleSummonerBasicDTO: Jayce's Duelists SILVER RANKED_TEAM_5x5
Entry: TEAM-6c8fc440-a8ac-11e4-b65b-c81f66db920c TopBlokesNeverToke III 0 20 18 false false false]}
Map<String, List<SingleSummonerBasicDTO>> summonersMap = new ObjectMapper()
.readValue(json, new TypeReference<HashMap<String, List<SingleSummonerBasicDTO>>>() {});