简体   繁体   中英

Retrofit - Deserilize Json response map into a property

I'm having a problem deserializing the response that I'm getting from retrofit. My problem is that I get the following response:

       "associations": {
            "1": {
                "uri": "https://api.ap.org/media/v/content/690b9f679b1d4d8abc8042ca53140625?qt=FckGhfkHkvF&et=0a1aza3c0&ai=881778bb579d79e17f54b046a86a81cf",
                "altids": {
                    "itemid": "690b9f679b1d4d8abc8042ca53140625",
                    "etag": "690b9f679b1d4d8abc8042ca53140625_0a1aza3c0"
                },
                "version": 0,
                "type": "picture",
                "headline": "Facebook Ads-Targeting Info"
            }
        }

My entity looks like the following:

public class Associations{

    private Map<String, JsonMember> association;

    public Map<String, JsonMember> getAssociation() {
        return association;
    }

    public void setAssociation(Map<String, JsonMember> association) {
        this.association = association;
    }
}

I want that association takes the value from the map, but I don't know how to specify that it takes the object inside that association. Those association keys can be returned as any number, so I can't hard code the "1". Any ideas? Thanks for your help!

You can read your json to a JsonNode and iterate over its properties names with a Iterator<String> iterator obtained calling the JsonNode#fieldNames method, selecting only the properties with a numeric name (this depends from what you mean for numeric, up to you the definition of a isNumber method):

Map<String, JsonMember> map = new HashMap<>();
//reading the jsonnode labelled with "associations"
JsonNode node = mapper.readTree(json).at("/associations");
Iterator<String> iterator = node.fieldNames();
        
while (iterator.hasNext()) {
      String next = iterator.next();
      if (isNumber(next)) { //<-- ok next is numeric
         map.put(next, mapper.treeToValue(node.get(next), JsonMember.class));
      }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM