2015-12-21 45 views
2

我對JSON相當陌生,而且我試着研究如何做,但不知道我是否完全理解。我想提出一個外部API調用返回:使用不同的對象名稱映射JSON

2015-12-21 01:22:09 INFO RiotURLSender:60 - Total json: 
{"USERNAME":{"profileIconId":984,"revisionDate":1450655430000,"name":"USERNAME2","id":38584682,"summonerLevel":30}} 

在哪裏「USERNAME」(和USERNAME2 - 這可能是USERNAME非常略有不同)將根據您通過什麼調用的參數變化。我正在使用Jackson Object Mapper來映射USERNAME對象中的各個值 - 但是沒有意識到我必須映射對象。

我一直在使用說明中,如DTO的:

@JsonProperty("profileIconId") 
private Long profileIconId; 

和映射使用:

summonerRankedInfoDTO = mapper.readValue(jsonString, SummonerRankedInfoDTO.class); 

如何映射使用用戶名正在改變每一次的價值呢?

此外,這似乎有點奇怪,這是不好的做法,有實際的變化的關鍵,而不是隻是有相同的關鍵和不同的價值?

感謝

回答

0

你應該儘量保持按鍵完全一樣的,如果可能的變化值,否則,你將不得不改變你的JSON。由於JSON從鍵返回值,該值可以更改爲任何想要的值,但是您可以從鍵中返回值。但這不起作用。

無論如何,你可能會有更好的運氣,像GSON庫一樣,它的使用非常簡單。

您可以創建實例,並將它傳遞的JSON字符串:

Gson gson = new Gson(); 
JsonObject obj = gson.fromJson(JSON_DOCUMENT, JsonObject.class); 

然後你可以從現在解析JSON對象的某些元素。

例如,在你的JSON字符串,用戶名返回另一個JSON元素,所以你可以做:

JsonObject username = obj.get("USERNAME").getAsJsonObject(); 

然後重複剛纔從那裏相同的步驟來獲得您所需要的任何值。 因此,要獲得它返回 「USERNAME2」 的名字:

username.get("name").getAsString(); 

一起出發:

JsonObject obj = gson.fromJson(JSON_DOCUMENT, JsonObject.class); 
JsonObject username = obj.get("USERNAME").getAsJsonObject(); 
username.get("name").getAsString(); 
3

你可以用以下提到的註釋@JsonAnyGetter和@JsonAnySetter。 將此代碼添加到您的域名類。因此,任何非映射屬性將在序列化和反序列化Object時填充到「nonMappedAttributes」映射中。

@JsonIgnore 
protected Map<String, Object> nonMappedAttributes; 

@JsonAnyGetter 
public Map<String, Object> getNonMappedAttributes() { 
    return nonMappedAttributes; 
} 

@JsonAnySetter 
public void setNonMappedAttributes(String key, Object value) { 
    if (nonMappedAttributes == null) { 
     nonMappedAttributes = new HashMap<String, Object>(); 
    } 
    if (key != null) { 
     if (value != null) { 
      nonMappedAttributes.put(key, value); 
     } else { 
      nonMappedAttributes.remove(key); 
     } 
    } 

}