当前位置: 首页 > 知识库问答 >
问题:

Jackson将JSON映射到Java POJO-不匹配状态异常

艾星河
2023-03-14

我正在使用SpringRest模板,并希望将JSON响应解析到相应的java POJO中。我每次都会得到一个不匹配的输入异常-无法反序列化的非启动数组令牌实例。

我研究了几个与杰克逊有关的问题,但没有找到合适的解决方案。我不确定我的POJO结构是否正确。

首先是相关的JSON:

{
   "days":[
      [
         {
            "day":"2019-04-29",
            "time":"08:00-09:30",
            "room":"room1",
            "name":"lecture1",
            "lecturer":"prof1",
            "eventId":332713,
            "modified":false
         }
      ],
      [

      ],
      [

      ],
      [
         {
            "day":"2019-05-02",
            "time":"08:00-10:15",
            "room":"room2",
            "name":"lecture2",
            "lecturer":"prof2",
            "eventId":332714,
            "modified":false
         },
         {
            "day":"2019-05-02",
            "time":"10:45-13:00",
            "room":"room3",
            "name":"lecture3",
            "lecturer":"prof3",
            "eventId":332721,
            "modified":false
         }
      ],
      [

      ],
      [

      ],
      [
      ]
   ]
}

POJO结构:

public class Main{

    ArrayList<Day> days = new ArrayList<>();

    public ArrayList<Day> getDays() {
        return days;
    }

    public void setDays(ArrayList<Day> days) {
        this.days = days;
    }

    public class Day {

        private String day;
        private String time;
        private String room;
        private String name;
        private String lecturer;
        private Integer eventId;
        private Boolean modified;

        public Day() {
        }
       // Getter and setter of Day Object
    }
}

API对象中的Rest模板方法:


public String getInfoByEventsPeriods(String eventIDs) {
        String url = APIURL + "/info?from="2019-04-29"&to="2019-05-03"&eventId=" + eventIDs;

        return rest.getForObject(url, String.class);
    }

在主对象中使用ObjectMapper进行处理:

public Main getLectures(String eventIDs) throws IOException {
        API api = new API();
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(api.getInfoByEventsPeriods(eventIDs), Main.class);

    }

共有2个答案

翁昊乾
2023-03-14

你能像下面这样拥有你的POJO吗?我试图用你的JSON反序列化,我成功地反序列化了。

class Day {

  private String day;
  private String time;
  private String room;
  private String name;
  private String lecturer;
  private Integer eventId;
  private Boolean modified;

  public void setDay(String day) {
    this.day = day;
  }

  public void setTime(String time) {
    this.time = time;
  }

  public void setRoom(String room) {
    this.room = room;
  }

  public void setName(String name) {
    this.name = name;
  }

  public void setLecturer(String lecturer) {
    this.lecturer = lecturer;
  }

  public void setEventId(Integer eventId) {
    this.eventId = eventId;
  }

  public void setModified(Boolean modified) {
    this.modified = modified;
  }
}

class Main{
  private List<List<Day>> days;
  public void setDays(List<List<Day>> days) {
    this.days = days;
  }
}
宗鸿博
2023-03-14

是的,你是对的,反序列化时使用了错误的类型
我不太确定,但是您的days数组包含另一个带有day对象的数组,但是在您的结构中,ArrayList由对象day组成,而不是它们的数组。

正确的JSON应该是:

{
   "days":[
         {
            "day":"2019-04-29",
            "time":"08:00-09:30",
            "room":"room1",
            "name":"lecture1",
            "lecturer":"prof1",
            "eventId":332713,
            "modified":false
         },
         {
            "day":"2019-05-02",
            "time":"08:00-10:15",
            "room":"room2",
            "name":"lecture2",
            "lecturer":"prof2",
            "eventId":332714,
            "modified":false
         },
         ......
   ]
}   

因此,根据需要修复的内容更改响应结构或pojo对象
如果您需要修改POJO,您的ArrayList必须包含天数列表。

 类似资料:
  • 我使用JAVA jackson将JSON映射到JAVA pojo对象,我的JSON文件是: 在之后,我收到了以下错误消息: 不能反序列化出START_ARRAY令牌 我的POJO课程: 请问,这种JSON格式的正确java POJO是什么?谢谢

  • 假设我有这样的物体 我正在使用RestTemboard类从URL中获取json,如下所示: 之后,我想使用jackson对象映射器将json字符串转换为一个对象 将实体类作为第二个参数传递 问题是我应该如何编写ExampleJson实体来处理get-Showed json?我试过这样上课,但似乎不管用。 我得到了这样一个例外:

  • 我和jackson一起绘制地图,我有点迷茫。我的Json具有以下结构 我确实找到了很多处理数组的教程,但我在第一个标记“d”时就已经失败了。而且根本不需要所有的“_元数据”标记。 我创建了一个包含lastName等属性和一个集合附件的pojo。但我的代码在标记“d”或“_元数据”时总是失败 还有杰克逊的读者 任何提示都将不胜感激。 问候马蒂亚斯

  • 我使用http://jsonlint.com来验证JSON是否有效。因此,我要么需要更改JSON或代码,要么可能两者都需要。有什么想法吗?

  • JSONMappingException:无法反序列化com.demo.json.model.abc实例 编辑:我的POJO如下所示: 有人能提出解决办法吗? 有人能帮我做这个吗?

  • 问题内容: 我想在我的静态服务中捕获json映射异常,以防输入json无效。 它抛出,但我不知道如何或在何处捕获此异常。我想捕获此异常并发送回适当的错误响应。 一切正常,但是如果json主体格式不正确,则会引发异常。我想抓住这个例外。 问题答案: 最终对我有用的是声明的提供者,例如