【问题标题】:While Converting Object to JSON Error :com.fasterxml.jackson.databind.exc.MismatchedInputException将对象转换为 JSON 时出错:com.fasterxml.jackson.databind.exc.MismatchedInputException
【发布时间】:2019-04-16 07:35:43
【问题描述】:

我正在尝试使用ObjectMapperList<Object> 转换为JSON 格式。我尝试如下但我得到了例外,即

com.fasterxml.jackson.databind.exc.MismatchedInputException:

    public List<ClientRT> callSP() throws IOException { 

            List<Object> crt=crtRepo.roomtype(60);          

            ObjectMapper mapper = new ObjectMapper();
            String json=mapper.writeValueAsString(crt);

            //ClientRT obj=mapper.readValue(json,ClientRT.class);

            List<ClientRT> obj=mapper.readValue(json,mapper.getTypeFactory()
                                                           .constructCollectionLikeType(List.class,ClientRT.class));
            return obj;
        }

ClientRT 类

public class ClientRT { 

    public Integer res_nclient_room_type_id;    
    public String res_sclient_rt_desc;
    public String  res_sclient_rt_name;
    public String res_sclient_rt_code;

    //getter setter

    public ClientRT() {
        super();
    }
    @Override
    public String toString() {
        return "ClientRT [res_nclient_room_type_id=" + res_nclient_room_type_id + ", res_sclient_rt_desc="
                + res_sclient_rt_desc + ", res_sclient_rt_name=" + res_sclient_rt_name + ", res_sclient_rt_code="
                + res_sclient_rt_code + "]";
    }
}

期待 JSON 格式的结果

[  
  { "res_nclient_room_type_id":1 ,   
    "res_sclient_rt_desc": "FACILITIES - AVAILABLE ROOM",
    "res_sclient_rt_name":"FACILITIES - AVAILABLE ROOM" ,
    "res_sclient_rt_code":"050" 
 },

]

例外

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.spacestudy.model.ClientRT` out of START_ARRAY token
 at [Source: (String)"[[1,"TEMPORARILY NOT ASSIGNED","TEMPORARILY NOT ASSIGNED","000"],[2,"FACILITIES - AVAILABLE ROOM","FACILITIES - AVAILABLE ROOM","050"],[3,"FACILITIES - UNDEFINED PURPOSE","FACILITIES - UNDEFINED PURPOSE","060"],[4,"FACILITIES - UNFINISHED AREA","FACILITIES - UNFINISHED AREA","070"],[5,"CLASSROOM/LECTURE HALL","CLASSROOM/LECTURE HALL","110"],[6,"CLASSROOM SERVICE","CLASSROOM SERVICE","115"],[7,"CLASSROOM STORAGE","CLASSROOM STORAGE","116"],[8,"CLASSROOM KITCHEN","CLASSROOM KITCHEN","119"],[9,"CLA"[truncated 8500 chars]; line: 1, column: 2] (through reference chain: java.util.ArrayList[0])

谁能告诉我如何解决这个异常?

【问题讨论】:

  • 你能发帖ClientRT类吗?还有一个json的例子。好像您将不正确的 json 传递给杰克逊
  • 我添加了类和示例 json

标签: java json objectmapper


【解决方案1】:

正如上面amicoderozer所说,您需要从json中而不是从类中删除ClientRT类的字段的数据类型。

【讨论】:

  • 对不起,我在 json 中错误地添加了公共字符串。但这是我的预期结果
  • 你能指定List&lt;Object&gt; crt包含什么类型的对象吗?
  • 我正在从 postgresql 调用存储函数,即 roomtype(60),即简单 select * from ClientRoomType
  • 列表List&lt;Object&gt; crt中的对象应该是ClientRT对象,否则Jackson会抛出MismatchedInputException
  • crt 仅包含 ClientRT 对象。但我正在尝试将对象转换为 json
【解决方案2】:

您传递给 Jackson 的 json 不正确。

而不是将这个 Json 传递给 Jackson:

[  
  { "res_nclient_room_type_id":1 ,   
    "public String res_sclient_rt_desc": "FACILITIES - AVAILABLE ROOM",
    "public String  res_sclient_rt_name":"FACILITIES - AVAILABLE ROOM" ,
    "public String res_sclient_rt_code":"050" 
 }
]

试试这个(从json中删除public String):

[  
  { "res_nclient_room_type_id":1 ,   
    "res_sclient_rt_desc": "FACILITIES - AVAILABLE ROOM",
    "res_sclient_rt_name":"FACILITIES - AVAILABLE ROOM" ,
    "res_sclient_rt_code":"050" 
  }
]

Jackson 无法解析 json,因为它在 ClientRT 类中找不到对应的 Java 字段。从json中移除public String,只留下ClientRT类的字段名。

【讨论】:

  • 只有类中的字段名称在没有数据类型的情况下给出错误
  • @SpringUser 您必须从 Json 中删除数据类型,而不是从 Java 类中删除。我编辑了答案
  • 没问题,唯一重要的是你理解错误。
  • json 是我的预期结果,但我的错误仍然存​​在
  • 您确定将正确的 json 传递给 Jackson 吗?我试过了,你的代码使用正确的 json 对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
相关资源
最近更新 更多