Java - 使用jackson将json转换为复杂对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java - 使用jackson将json转换为复杂对象相关的知识,希望对你有一定的参考价值。
这可能是重复的问题,但我已经搜索了很多解决方案,但没有运气。我有一个类如下:
public class RestartMapState {
public RestartMapState(List<MapStepData> vMapStepData, List<AbstractMap.SimpleEntry<String,String>> vResolvedParameters, String vJobID){
this.vJobID=vJobID;
this.vResolvedParameters = vResolvedParameters;
this.vMapStepData = vMapStepData;
}
public RestartMapState(){}
private List<MapStepData> vMapStepData;
public void setvMapStepData(List<MapStepData> mapStepData){ this.vMapStepData = mapStepData; }
public List<MapStepData> getvMapStepData(){
return this.vMapStepData;
}
private List<AbstractMap.SimpleEntry<String,String>> vResolvedParameters;
public List<AbstractMap.SimpleEntry<String,String>> getvResolvedParameters(){ return this.vResolvedParameters; }
public void setvResolvedParameters(List<AbstractMap.SimpleEntry<String,String>> resolvedParameters){ this.vResolvedParameters = resolvedParameters; }
private String vJobID;
public String getvJobID(){ return this.vJobID; }
public void setvJobID(String jobID){ this.vJobID = jobID; }
}
当我使用以下代码尝试使用json时,我正在获取json文件。
RestartMapState vRestartMapState = new RestartMapState(vRemainingStepsToBeExecuted, vMapResolvedParameters, vMapExCtx.getvJobID());
try {
vObjectMapper.writerWithDefaultPrettyPrinter().writeValue(stateFile, vRestartMapState);
} catch (JsonGenerationException e) {
isSerialized = false;
e.printStackTrace();
} catch (JsonMappingException e) {
isSerialized = false;
e.printStackTrace();
} catch (IOException e) {
isSerialized = false;
e.printStackTrace();
}
我的JSON文件如下所示:
{
"vMapStepData" : [ {
"dependsOn" : null,
"orderIndex" : 0,
"name" : "Step1",
"mapStepId" : 167119,
"sqlstatements" : {
"sqlstatement" : [ {
"value" : "-- Map Step (Step1)
CREATE TABLE ##!sessionid##Step1
AS
SELECT currency_nbr AS currency_nbr,...",
"orderIndex" : 1,
"isQuery" : false,
"flags" : [ "PartOfCore" ]
} ]
}
}, {
"dependsOn" : null,
"orderIndex" : 1,
"name" : "Step2",
"mapStepId" : 237822,
"sqlstatements" : {
"sqlstatement" : [ {
"value" : "
-- Map Step (Step2)
CREATE TABLE ##!sessionid##Step2
AS
SELECT country_cd AS ....",
"orderIndex" : 1,
"isQuery" : false,
"flags" : [ "PartOfCore" ]
} ]
}
} ],
"vResolvedParameters" : [ {
"key" : "##RUNDATE##",
"value" : "2018045"
}, {
"key" : "##julian##",
"value" : "2018033"
} ],
"vJobID" : "10012"
}
但是当我尝试将相同的json文件反序列化为RestartMapState类型的对象时,我收到以下错误。
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class java.util.AbstractMap$SimpleEntry<java.lang.String,java.lang.String>]: can not instantiate from JSON object (need to add/enable type information?)
at [Source: C:Usersvkukk1.MAP_STATE_System_Test_Group_Vasu_Test_2_10012.json; line: 30, column: 5] (through reference chain: com.aexp.idn.magellan.RestartMapState["vResolvedParameters"]) RestartMapState vRestartMapState = null;
有人可以帮我解决这个问题,我做错了什么?
类AbstractMap.SimpleEntry
没有默认构造函数(没有参数),也不能反序列化。
您应该将vResolvedParameters
的通用类型从AbstractMap.SimpleEntry<String,String>
更改为其他类型:
private List<Pair<String, String>> vResolvedParameters;
public List<Pair<String, String>> getvResolvedParameters() {
return this.vResolvedParameters;
}
public void setvResolvedParameters(List<Pair<String, String>> resolvedParameters) {
this.vResolvedParameters = resolvedParameters;
}
Pair
在哪里:
private static class Pair<K, V> {
private K key;
private V value;
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
...
}
您可以使用许多其他库中的Pair
实现。
或者,如果"key"
的值是唯一的,您可以将vResolvedParameters
类型更改为Map<String,String>
。但是您的JSON格式将从以下更改:
...
"vResolvedParameters" : [ {
"key" : "##RUNDATE##",
"value" : "2018045"
}, {
"key" : "##julian##",
"value" : "2018033"
} ],
...
至:
...
"vResolvedParameters": {
"##RUNDATE##": "2018045",
"##julian##": "2018033"
},
...
最后我解决了这个问题。问题在于vResolvedParameter的getter方法。我已经更改了getter方法,如下所示:
private List<MapStepData> vMapStepData;
public void setvMapStepData(List<MapStepData> mapStepData){ this.vMapStepData = mapStepData; }
public List<MapStepData> getvMapStepData(){ return this.vMapStepData; }
private Map<String,String> vResolvedParameters;
public Map<String,String> getvResolvedParameters() { return this.vResolvedParameters; }
谢谢@Nokolay。
以上是关于Java - 使用jackson将json转换为复杂对象的主要内容,如果未能解决你的问题,请参考以下文章
使用jackson将pojo(对象列表)转换为java中的json
将JSON转换为Java Object,如何使用Jackson解析BadgerFish约定
使用 Jackson 将 JSON 字符串转换为漂亮的打印 JSON 输出
在将 json 反序列化为对象时,使用 jackson 将 asp.net / MS 专有 json Dateformat 转换为 java8 LocalDateTime