【问题标题】:Mapping JSON with varying object name使用不同的对象名称映射 JSON
【发布时间】:2015-12-21 02:33:37
【问题描述】:

我对 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 值进行映射?

这似乎有点奇怪,拥有实际变化的键而不是仅仅具有相同的键和不同的值,这是不好的做法吗?

谢谢

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    你可以使用下面提到的注解@JsonAnyGetter 和@JsonAnySetter。 将此代码添加到您的域类中。因此,在序列化和反序列化对象时,任何非映射属性都将填充到“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);
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      如果可能,您应该尽量保持键完全相同并更改值,否则您将不得不更改 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();
      

      【讨论】:

        猜你喜欢
        • 2018-01-05
        • 2012-04-02
        • 2019-06-03
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多