使用不同的对象名称映射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();
- 如何将JSON字符串转换为Java对象的列表?
- 使用条件动态排除Jackson json序列化中的POJO属性
- 为什么jackson多态序列化在列表中不起作用?
- RESTEASY003145:无法找到内容类型application / json的MessageBodyReader并键入class org.keycloak.representations.AccessTokenResponse
- jackson多态反序列化 – 您是否可以要求存在字段而不是特定值?
- 从spring mvc controller返回一个简单的map结构到ajax
- jackson:不同的XML和JSON格式
- 如何配置Jackson以默认键入反序列化命名类型?
- jackson没有逃脱JSON中的引用