Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson解析JSON,其中包含对象数组和带有动态键的映射数组_Java_Android_Json_Jackson - Fatal编程技术网

Java Jackson解析JSON,其中包含对象数组和带有动态键的映射数组

Java Jackson解析JSON,其中包含对象数组和带有动态键的映射数组,java,android,json,jackson,Java,Android,Json,Jackson,我有这样的json: { "users":{ "1234":{ "firstname":"Joe", "lastname":"Smith" }, "9876":{ "firstname":"Bob", "lastname":"Anderson" } },

我有这样的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;
}
公共类MyCustomClass{
@JsonProperty(“作业”)
ArrayList工作;
@JsonProperty(“用户”)
ArrayList用户映射;
}
现在作业可以完美地解析为作业对象,但我无法让用户进行解析,因为他们有动态键。我阅读了关于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;
}


}
公共类用户映射{
私有HashMap usersMap;
@JSONANYSETER
公共void添加(字符串键,用户){
usersMap.put(键,用户);
}
@JsonAnyGetter
公共映射getUsersMap(){
返回usersMap;
}
}

但这不起作用。我想我可以用一个TypeReference包装器来实现这一点,但我只能想一种方法,如果这些映射是我得到的唯一类型的话。由于我要返回不同的类型(用户和作业),有可能做到这一点吗?

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

请参见如何使用您自己的反序列化程序

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

例如:

"users":{
       {
             "id":"1234",
             "firstname":"Joe",
             "lastname":"Smith"
       },
       {
             "id":"9876",
             "firstname":"Bob",
             "lastname":"Anderson"
       }     
解决方案:

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

    @JsonProperty("jobs")
    public ArrayList<Job> jobs;
}    
公共类MyCustomClass{
@JsonProperty(“用户”)
公共LinkedHashMap用户;
@JsonProperty(“作业”)
公共ArrayList职位;
}    

您的json无效。在“Anderson”一词之后,你已经纠正了我的拼写错误。现在应该是有效的json。