【问题标题】:Jackson MismatchedInputException (no String-argument constructor/factory method to deserialize from String value)Jackson MismatchedInputException(没有从字符串值反序列化的字符串参数构造函数/工厂方法)
【发布时间】:2021-09-22 02:52:21
【问题描述】:

我正在使用SpringBoot 2.3.1-RELEASE 并尝试将 JSON 字符串反序列化为包含对象列表的 POJO,但我一直遇到此错误:

无法构造com.response.dto.RootDTO 的实例(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法可以从字符串值反序列化('Meta') 在 [Source: (String)""Meta":[{"DimensionName":"Version","DimensionId":"3b4860b9-b215-4192-bd7a-a76f377fc465","DimensionType":"Regular","Alias": "C0","AttributeId":"211d5-d91f-40ec-9668-20e0da2ae7b3","AttributeName":"Version Name","AttributeKey":"VersionKey";行:1,列:1]

这就是我的 JSON 字符串的样子(但在 eclipse 中带有转义字符):

{"Meta":[{"DimensionName":"Version", "DimensionId":"3b4860b9-b215-4192-bd7a-a76f377fc465, "DimensionType":"Regular","别名":"C0"," AttributeId":"211b33d5-d91f-40ec-9668-20e0da2ae7b3","AttributeName":"Version Name","AttributeKey":"VersionKey"}]}。

这是我想反序列化的类:

@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class RootDTO 
{
  @JsonProperty("Meta")
  private List<MetaDTO> Meta;
}


 @JsonIgnoreProperties(ignoreUnknown = true)
 @Data
 public class MetaDTO 
{

 @JsonProperty("DimensionName")
 private String DimensionName;

 @JsonProperty("AttributeId")
 private String AttributeId;

 @JsonProperty("AttributeName")
 private String AttributeName;

 @JsonProperty("Name")
 private String Name;

 @JsonProperty("Alias")
 private String Alias;
}

这是尝试读取值时崩溃的代码:

 ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
        
  objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
         
        objectMapper.readValue(jsonFormattedString, RootDTO.class));
         

我只在运行Junit(版本:4.12)时看到这个问题。我在堆栈跟踪中看到jackson-databind-2.11.0spring-test-5.2.7.RELEASE。但是,我使用来自浏览器或邮递员的调用进行调试,它工作正常。当我将它指定为列表时,我不确定它为什么要查找字符串 Meta。什么可能导致此问题?有什么建议吗?

编辑:原来提供给ObjectMapper 的字符串不是正确的。有这行代码 String jsonFormattedString = responseEntity.getBody().substring(1, responseEntity.getBody().lastIndexOf("\"")).replaceAll("\\\\", ""); 这使我的模拟字符串无效。不过,我需要弄清楚我们为什么要这样做。

【问题讨论】:

    标签: java json spring-boot jackson objectmapper


    【解决方案1】:

    将变量的第一个字母改为小写。并删除 JsonProperty。

    如下。并自动生成 setter 和 getter。

    私有字符串维度名称;

     private String attributeId;
     private String attributeName;
     private String name;
    
     public void setName(String name){
           this.name=name;
     }
     .........
     .........
     //All setter getter
    

    添加@JsonGetter("Meta")每个getter方法。

    例如如下。

    @JsonGetter("Meta")
    public List<Meta> getMeta(){
    
    return meta;
    
    }
    

    【讨论】:

    • 谢谢,但我想我找到了我的问题。请参阅上面的编辑。
    • 如果您将 JSON 发布到字符串,它将使用正斜杠执行选项卡。
    • 可以直接添加Json字符串,不需要替换。
    • 字符串 bjsonString = json;
    • 由于您的 setter getter 方法全部大写导致的问题
    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 2018-09-09
    • 1970-01-01
    • 2019-12-31
    • 2017-12-23
    • 2019-05-15
    • 2017-04-20
    • 2017-05-05
    相关资源
    最近更新 更多