使用不同的对象名称映射JSON

我对JSON很陌生,而且我已经四处寻找尝试做什么但不确定我是否完全理解。 我正在进行外部API调用返回:

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); 

如何使用每次都在更改的USERNAME值进行映射?

这看起来有点奇怪,这是一个不好的做法,实际变化的关键,而不是只有相同的键和不同的值?

谢谢

你可以使用下面提到的注释@JsonAnyGetter和@JsonAnySetter。 将此代码添加到您的域类中。 因此,在序列化和反序列化Object时,任何非映射属性都将填充到“nonMappedAttributes”映射中。

 @JsonIgnore protected Map nonMappedAttributes; @JsonAnyGetter public Map getNonMappedAttributes() { return nonMappedAttributes; } @JsonAnySetter public void setNonMappedAttributes(String key, Object value) { if (nonMappedAttributes == null) { nonMappedAttributes = new HashMap(); } if (key != null) { if (value != null) { nonMappedAttributes.put(key, value); } else { nonMappedAttributes.remove(key); } } } 

如果可能,您应该尝试保持密钥完全相同并更改值,否则您将不得不更改您的JSON。 由于JSON从键中返回一个值,因此该值可以更改为它想要的任何值,但您可以从键中返回它。 但这并不是相反的方式。

无论如何,使用像GSON库这样的东西,你可能会有更好的运气,它非常简单易用。

您可以创建实例并将其传递给JSON字符串:

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

然后,您可以从现在解析的JSON对象中获取某些元素。

例如,在您的JSON字符串中,username返回另一个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();