2015-12-21 5 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, но не понимал, что мне нужно также отображать объект.

Я использую аннотации в DTOS как:

@JsonProperty("profileIconId") 
private Long profileIconId; 

и отображение с помощью:

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

Как пакетно значения USERNAME, который меняется каждый раз?

Также это кажется немного странным, неужели эта плохая практика имеет реальный переменный ключ, а не только тот же ключ и другое значение?

Благодаря

ответ

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. Добавьте этот код в класс домена ur. Таким образом, любой не отображаемый атрибут будет заселен в карту «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); 
     } 
    } 

} 
Смежные вопросы