【发布时间】:2020-09-14 10:42:04
【问题描述】:
我有一个带有以下响应的休息端点
{
"Shops": {
"Shop": [
{
"RowID": "1",
"Penalties": {
"Penalty": [
{
"PenaltyCode": "abc-01",
"PenaltyCount": "1"
},
{
"PenaltyCode": "abc-02",
"PenaltyCount": "2"
}
]
},
"VisitOutComes": {
"VisitOutCome": {
"TaskOutComeName": "text",
"TaskOutComeCount": "1"
}
}
}
]
}
}
我需要使用休眠在 RDMS 中插入响应。 我已经完成了休眠部分和其余的客户端部分。 我很困惑如何将 json 映射到 java 类。
我编写了以下类,为清楚起见省略了 getter 和 setter。
public class Shops {
@JsonProperty("Shop")
private ArrayList<Shop> shop ;
public class Shop {
@JsonProperty("VisitOutComes")
private VisitOutComes visitOutComes ;
@JsonProperty("Penalties")
private Penalties penalties ;
@JsonProperty("RowID")
private String rowID ;
public class VisitOutComes {
@JsonProperty("VisitOutCome")
ArrayList<VisitOutCome> visitOutCome ;
public class Penalties {
@JsonProperty("Penalty")
ArrayList<Penalty> penalty ;
public class VisitOutCome {
@JsonProperty("TaskOutComeCount")
private String TaskOutComeCount;
@JsonProperty("TaskOutComeName")
private String TaskOutComeName ;
public class Penalty {
@JsonProperty("penaltyCode")
private String penaltyCode ;
@JsonProperty("penaltyCount")
private String penaltyCount ;
然后我写main方法如下:
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
String path = "C:\\jars\\response.json" ;
Shops shops = mapper.readValue(new File(path),Shops.class);
终于报错了
无法反序列化 java.util.ArrayList jscksondemo.VisitOut 的实例来自 START_OBJECT 令牌
感谢任何有关如何为此 json 文件创建映射的帮助。
【问题讨论】:
-
VisitOutCome不是您的 json 中的数组 -
那是因为只有一项的时候其余的web服务都是这样返回的。
-
我认为将休眠实体(基于表格建模)与 API 响应分开是一个更好的设计。并且您编写转换器类以在两种格式之间进行转换。这将保护您的数据库层代码和实体免受 API 响应更改的直接影响,这也将帮助您处理当前属性可能是数组或对象的情况。
-
您需要启用
DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY功能。看看链接的问题。