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