Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Hashmap中使用带有ArrayList的JsonAnySetter和JsonAnyGetter_Java_Json_Jackson - Fatal编程技术网

Java 在Hashmap中使用带有ArrayList的JsonAnySetter和JsonAnyGetter

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

所以我正试图用Jackson注释来让我的头脑清醒过来,我正在对Riot的API发出请求。这是我得到的答复:。其中,召唤ID(38584682)后面的数组可以具有不同的长度

唯一的召唤者ID每次都会不同

我想将此响应映射到DTO

对于类似情况,我正在进行不同的呼叫:

@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>>>() {});