【问题标题】:Jackson parsing JSON containing an array of objects and array of maps w/ dynamic keys杰克逊解析包含对象数组和带有动态键的地图数组的 JSON
【发布时间】:2013-07-28 02:38:37
【问题描述】:

我有这样的json:

{

    "users":{
           "1234":{
                 "firstname":"Joe",
                 "lastname":"Smith"
           },
           "9876":{
                 "firstname":"Bob",
                 "lastname":"Anderson"
           }
    },
    "jobs":[
          {
              "id":"abc",
              "location":"store"
          },
          {
              "id":"def",
              "location":"factory"
          }
    ]
}

我正在使用 Jackson 解析这个,所以我一直在使用 readvalue(json, MyCustomClass.class) 解析响应

MyCustomClass 的样子

public class MyCustomClass{
      @JsonProperty("jobs")
      ArrayList<Job> jobs;

      @JsonProperty("users")
      ArrayList<UserMap> usersMap;
}

现在作业完美地解析为 Jobs 对象,但我无法让用户解析,因为他们有动态键。我阅读了有关 JsonAnyGetter/Setter 并尝试制作映射字符串的 UserMap 对象映射 -> 用户喜欢:

public class UserMap {

private HashMap<String,User> usersMap;


@JsonAnySetter
public void add(String key, User user){
    usersMap.put(key, user);
}

@JsonAnyGetter
public Map<String, User> getUsersMap(){
    return usersMap;
}


}

但这不起作用。我想我可以使用 TypeReference 包装器来做到这一点,但如果这些地图是我返回的唯一类型,我只能想办法做到这一点。由于我得到了不同的类型(用户和工作),是否可以这样做?

【问题讨论】:

  • 您的 json 无效。例如,在“安德森”之后
  • 对不起,这是我的错字,已修复。现在应该是有效的 json。

标签: java android json jackson


【解决方案1】:

解决方案:

public class MyCustomClass {
    @JsonProperty("users")
    public LinkedHashMap<String, User> users;

    @JsonProperty("jobs")
    public ArrayList<Job> jobs;
}    

【讨论】:

    【解决方案2】:

    您可以通过编写自己的自定义反序列化器并将其注册到您正在使用的对象映射器来解决这个问题。这应该可以工作,因为您将完全控制每个对象如何反序列化为用户对象。

    请参阅this jackson documentation,了解如何推出自己的解串器。

    还想说,如果您可以控制 json 结构 - 我会将键值(我猜是用户的 ID)更改为实际 json 对象的一部分,而不是钥匙。这将帮助您一起避免这个问题。

    例如:

    "users":{
           {
                 "id":"1234",
                 "firstname":"Joe",
                 "lastname":"Smith"
           },
           {
                 "id":"9876",
                 "firstname":"Bob",
                 "lastname":"Anderson"
           }     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      相关资源
      最近更新 更多