java - 无法构造 java.util.LinkedHashMap 的实例:没有字符串参数构造函数/工厂
问题描述
在解析文件并转换为 POJO 时遇到问题。下面是我得到的例外。
com.fasterxml.jackson.databind.JsonMappingException:无法构造 java.util.LinkedHashMap 的实例:没有从字符串值反序列化的字符串参数构造函数/工厂方法('{\"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);
}
}
解决方案
您的例外是准确地告诉您这里发生了什么。
com.fasterxml.jackson.databind.JsonMappingException:无法构造 java.util.LinkedHashMap 的实例:没有从字符串值反序列化的字符串参数构造函数/工厂方法('{\"hosturl_path\":\"/images\"} ')
在您的TestPojo.class
中,您正试图将 a 反序列String
化为Map
.
@JsonProperty("a112b")
private Map<String,String> parameterMap;
如果您要将此调整为您的 TestPojo.class
@JsonProperty("a112b")
private String parameterMap;
您将获得成功的运行。但是,我想这不是理想的行为。如果你有能力改变你的sampleFile
杰克逊应该能够正确地反序列化它。
{"test": [{
"a112a": "testhost",
"a112b": {"hosturl_path":"images"}
}]}
否则。您将需要指定一个自定义反序列化器。
@JsonDeserialize(CustomParameterDeserializer.class)
@JsonProperty("a112b")
private Map<String,String> parameterMap;
推荐阅读
- sql - 如何编写 PL/SQL 块来获得数字的加法?例。如果输入 245 它应该像 2+4+5 一样处理加法
- php - 第一个更新查询已执行,但第二个更新查询未在 ubuntu 服务器中执行。ubuntu 安装在 oracle vmware 中
- python - 如何为模型添加多个过滤器
- mysql - 在开始新的更改操作之前缺少逗号
- c# - 在 try 块中返回的伪代码是什么?
- javascript - 如何修复这个使用绝对位置的选项卡布局?
- php - 如何在 PHP 中的 BigQuery 的 google-api 中使用 insert 语句
- reactjs - Reactjs - Reactjs 中的更新动态构建。客户端想要更新 ReactJs 构建中的主机名和端口。他怎么能做到?
- ios - Xcode 10 主线程检查器:Cordova 相机插件
- javascript - 在javascript中处理许多事件侦听器的正确方法