我正在尝试将以下JSON转换为Java对象,并最终导致UnrecognizedPropertyException。
{
"5214": [{
"name": "sdsds",
"age": "25",
"address": null
},
{
"name": "sdfds",
"age": "26",
"address": null
}]
}
"5214"
是我得到的随机密钥。我可以通过稍微修改JSON来隐蔽它。但是我想知道是否有任何可能的方法来转换提到的JSON。我什至尝试了以下片段作为参考。
public class SampleTest {
private Map<String, List<EmployeeDetails>> employeeDetails = new HashMap<String, List<EmployeeDetails>>();
public Map<String, List<EmployeeDetails>> getEmployeeDetails() {
return employeeDetails;
}
public void setEmployeeDetails(Map<String, List<EmployeeDetails>> employeeDetails) {
this.employeeDetails = employeeDetails;
}
}
public class EmployeeDetails {
private String name;
private String age;
private String address;
//Getters and Setters
}
有人可以指导我吗?
答案 0 :(得分:1)
使用类型参考(导入Java的Jackson软件包)
TypeReference<Map<String, List<EmployeeDetails>>> typeReference = new TypeReference<Map<String, List<EmployeeDetails>>>()
{
};
Map<String, List<EmployeeDetails>> employeeDetails = new ObjectMapper().readValue(jsonString, typeReference);
答案 1 :(得分:0)
检查that中的内容
也许:
public class Data {
// String contain the Key, for example: 5214
Map<String, List<EmployeeDetails>> employeeDetails =
new HashMap<String,List<EmployeeDetails>>();
public Data() {
}
@JsonAnyGetter
public Map<String, List<EmployeeDetails>> getEmployeeDetails() {
return employeeDetails;
}
}
答案 2 :(得分:0)
我将使用少量帮助程序类的自定义反序列化器。为了使代码(我想是很明确)更清晰,请创建列表对象:
@SuppressWarnings("serial")
@Getter @Setter
public class EmployeeDetailsList extends ArrayList<EmployeeDetails> {
// this will hold the arbitrary name of list. like 5214
private String name;
}
然后此列表似乎在一个对象内部,例如Wrapper
:
@Getter
@RequiredArgsConstructor
@JsonDeserialize(using = WrapperDeserializer.class)
public class Wrapper {
private final EmployeeDetailsList employeeDetailsList;
}
因此,有注释@JsonDeserializer
处理反序列化Wrapper
。无法将未知字段名称直接反序列化为某些定义的类型,因此我们需要使用这种自定义反序列化器之类的机制,该机制检查Wrapper
中的内容并确定要反序列化的内容以及如何进行反序列化。
以下是解串器的工作原理:
public class WrapperDeserializer extends JsonDeserializer<Wrapper> {
private final ObjectMapper om = new ObjectMapper();
@Override
public Wrapper deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
TreeNode node = p.readValueAsTree();
// This is the place for caution. You should somehow know what is the correct node
// Here I happily assume there is just the one and first
String fName = node.fieldNames().next();
EmployeeDetailsList edl = om.readValue(node.get(fName).toString(),
EmployeeDetailsList.class);
edl.setName(fName);
return new Wrapper(edl);
}
}
请仔细检查它,从某种意义上来说,找到正确的节点并不完美,并且可以用其他方法更好地实例化。但是它应该让您有预感该怎么做。
答案 3 :(得分:-3)
您正在映射到不正确的POJO。应该是这样。
true