【问题标题】:Can not deserialize instance of java.lang.String out of START_OBJECT token String.class无法从 START_OBJECT 令牌 String.class 中反序列化 java.lang.String 的实例
【发布时间】:2019-02-08 09:44:40
【问题描述】:

我第一次遇到将 ObjectMapper 与 String.class 一起使用。我尝试将 json 作为得到 JsonMappingException 的字符串。你能帮忙理解为什么吗?

public static void main(String args[]) throws JsonParseException, JsonMappingException, IOException{
       String response="{\"response\":\"success\"}";
       ObjectMapper objectMapper = new ObjectMapper();
        Object object = objectMapper.readValue(response, String.class);
        System.out.println(object);
   }

回复:

线程“main”中的异常 com.fasterxml.jackson.databind.JsonMappingException:不能 从 START_OBJECT 令牌中反序列化 java.lang.String 的实例 [来源:{“响应”:“成功”};行:1,列:1] 在 com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270) 在 com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1234) 在 com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1122) 在 com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1075) 在 com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:60) 在 com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2858)

当我将响应传递为“成功”时,我得到了:

线程“main”中的异常 com.fasterxml.jackson.core.JsonParseException:无法识别的令牌 “成功”:期待(“真”、“假”或“空”)

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    正确的方法是read it as tree:

    ObjectMapper om = new ObjectMapper();
    JsonNode tree = om.readTree("{\"response\":\"success\"}");
    String response = tree.get("response").asText();
    System.out.println(response);
    

    输出: success

    【讨论】:

      【解决方案2】:

      因为你传递了 json 对,其中 response 是一个字段名,success 是这个字段的一个值,所以你需要创建类 ResponseDTO

      public class ResponseDto { private String response; //getter/setter here

       Object object = objectMapper.readValue(response, ResponseDTO.class);
      

      希望对你有帮助。

      【讨论】:

      • 我需要的是适用于 String.class 的响应
      • 没有Json结构的简单文本响应就可以了。
      • 我只尝试了“成功”,但我得到了 jsonparseException。我也添加了这个问题
      • 我的意思是在这种情况下你不需要使用 ObjectMapper。如果您的响应只是一个字符串,您可以按原样使用它。
      • 你说得对。我不确定。这是现有的代码。正在为实现这个的方法编写junit
      猜你喜欢
      • 2019-06-01
      • 2013-10-23
      • 2019-12-13
      • 2017-09-23
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      相关资源
      最近更新 更多