无法构造 java.util.LinkedHashMap 的实例:没有字符串参数构造函数/工厂

Posted

技术标签:

【中文标题】无法构造 java.util.LinkedHashMap 的实例:没有字符串参数构造函数/工厂【英文标题】:Can not construct instance of java.util.LinkedHashMap: no String-argument constructor/factory 【发布时间】:2019-01-21 23:25:22 【问题描述】:

在解析文件并转换为 POJO 时遇到问题。 我得到了以下异常。

com.fasterxml.jackson.databind.JsonMappingException:方法可从字符串值反序列化('\"hosturl_path\":\"/images \"')

示例 json 文件:

"test": [
     "a112a": "testhost", 
     "a112b": "\"hosturl_path\":\"/images\""
]

POJO -

import java.io.Serializable;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.ANY,
        setterVisibility = JsonAutoDetect.Visibility.ANY)
public class TestPojo implements Serializable

    private static final long serialVersionUID = 638312139361412L;

    @JsonProperty("a112a")
    private String host;

    @JsonProperty("a112b")
    private Map<String,String> parameterMap;

    public TestPojo()
    
    

    public TestPojo(String host, Map<String, String> parameterMap)
    
        this.host = host;
        this.parameterMap = parameterMap;
    

    public String getHost()
    
        return host;
    

    public void setHost(String host)
    
        this.host = host;
    

    public Map<String, String> getParameterMap()
    
        return parameterMap;
    

    public void setParameterMap(Map<String, String> parameterMap)
    
        this.parameterMap = parameterMap;
    

主类

import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;


public class TestApp

    public static void main(String[] args) throws IOException
    
        ObjectMapper mapper = new ObjectMapper();

        String fileName = "sampleFile.json";

        URL resource = TestApp.class.getResource(fileName);

        Map<String,List<TestPojo>> map = mapper.readValue(resource, new
                TypeReference<Map<String, List<TestPojo>>>()
                
                );

        System.out.println(map);
    

【问题讨论】:

你有什么问题?您了解为什么会出现异常吗? 已对 json 文件进行了更改。请立即检查。 好的...你仍然有一个字符串值而不是一个对象。 【参考方案1】:

你的异常告诉你这里到底发生了什么。

com.fasterxml.jackson.databind.JsonMappingException:无法构造 java.util.LinkedHashMap 的实例:没有字符串参数构造函数/工厂方法可从字符串值反序列化('\"hosturl_path\":\"/images \"')

在您的TestPojo.class 中,您正尝试将String 反序列化为Map

@JsonProperty("a112b")
private Map<String,String> parameterMap;

如果你要根据你的 TestPojo.class 调整它

@JsonProperty("a112b")
private String parameterMap;

您将获得成功的运行。但是,我想这不是理想的行为。如果你有能力改变你的sampleFileJackson 应该能够正确地反序列化它。

"test": [
 "a112a": "testhost", 
 "a112b": "hosturl_path":"images"
]

否则。您需要指定一个自定义反序列化器。

@JsonDeserialize(CustomParameterDeserializer.class)
@JsonProperty("a112b")
private Map<String,String> parameterMap;

【讨论】:

以上是关于无法构造 java.util.LinkedHashMap 的实例:没有字符串参数构造函数/工厂的主要内容,如果未能解决你的问题,请参考以下文章

为啥无法在类上找到适当的构造函数

无法解析片段中的 ViewModelProvider 构造?

无法构造 java.util.LinkedHashMap 的实例:没有字符串参数构造函数/工厂

Matlab在构造函数中无法更改类的参数

无法构造 `java.time.ZonedDateTime` 的实例(不存在创建者,如默认构造)

为啥这个构造函数无法在 Codeigniter 中加载?