【问题标题】:maping of JSON response using jackson [duplicate]使用杰克逊映射 JSON 响应 [重复]
【发布时间】: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 功能。看看链接的问题。

标签: java json jackson


【解决方案1】:

试试这个 JSON:

{
    "Shops": {
        "Shop": [
            {
                "RowID": "1",
                "Penalties": {
                    "Penalty": [
                        {
                            "PenaltyCode": "abc-01",
                            "PenaltyCount": "1"
                        },
                        {
                            "PenaltyCode": "abc-02",
                            "PenaltyCount": "2"
                        }
                    ]
                },
                "VisitOutComes": {
                    "VisitOutCome": [
                        {
                            "TaskOutComeName": "text",
                            "TaskOutComeCount": "1"
                        }
                    ]
                }
            }
        ]
    }
}

我认为您的 VisitOutCome List 的括号不正确。

【讨论】:

  • 其实我是从其他 webservies 得到 json 的,我不能编辑。
  • 我也使用链接jsonlint.com进行了验证
  • 我明白了你的想法,我的示例 json 只有一个 visitOutcome,这就是它以这种方式形成的原因。但在实际情况下,visitOutcome 可能是一个数组,也可能是单个项目。
  • 是的,我也验证了它的语法是正确的。如果 json 是固定的,则 VisitOutComes 类中使用的类型不正确。可以看到和惩罚列表是同一种类型,但是检索到的json对象结构不同。
  • 是的,列表大小也会导致它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2011-10-22
相关资源
最近更新 更多