将 LinkedHashMap<String,MyClass> 转换为 Java 对象
Converting LinkedHashMap<String,MyClass> to Java Object
我怎样才能像这样转换 JSON 字符串:
{ "summary": {
"totalMR":4.599000000000903E12,
"totalMA":1.9174920000386694E11,
"totalQA":5.1111111181E9,
"totalQR":1.000020666115264E11
},
"result": [{},{}],
"success":"true",
"total":49
}
到 Java 对象。我浏览了许多类似的帖子并实现了构造函数,但找不到正确的解释为什么我无法反序列化 JSON.
我做错了什么吗?
我的Class:
public class expResponse {
private String success;
private String total;
private ArrayList<LinkedHashMap<String,Object>> result;
private LinkedHashMap<String,SummaryResponse> summary;
// Constructor: public expResponse(){}
// Getter and Setter
}
public class SummaryResponse {
private Float totalQR;
private Float totalQA;
private Float totalMR;
private Float totalMA;
public SummaryResponse(){}
// Setter and Getter
}
我的代码:
private expResponse processResult(String result) throws IOException{
ObjectMapper objectMapper = new ObjectMapper();
expResponse expResponseObj =
objectMapper.readValue(result, expResponse.class);
return expResponseObj;
是不是不能反序列化的SummaryResponse?
我猜你的属性应该同名 "totalMR", "totalMA"...
或者你应该使用注释 JsonProperty(value="totalMR") 等等。
您发布的 json 不会反序列化为 SummaryResponse 对象的映射,而是一个单独的 SummaryResponse 对象。要使您的绑定工作,您必须 json 看起来像这样:
{
...
'summary': {
'summary1': {"totalMR":4.599000000000903E12,"totalMA":1.9174920000386694E11,"totalQA":5.1111111181E9,"totalQR":1.000020666115264E11}
'summary2': {"totalMR":4.599000000000903E12,"totalMA":1.9174920000386694E11,"totalQA":5.1111111181E9,"totalQR":1.000020666115264E11}
}
...
}
或者,如果您需要使您的 Java class 符合您提供的 json,您只需更改摘要声明:
private SummaryResponse summary;
您 json 中的字段摘要是 SummaryResponse 类型的对象,而不是 LinkedHashMap。
public class ExpResponse {
private String success;
private String total;
private ArrayList<LinkedHashMap<String,Object>> result;
private Summary summary;
}
我认为您的代码没有问题。您的输入失败,因为它的格式不正确。如果您尝试将具有相同值的对象中的相同值写入字符串,您会得到如下内容:
{
"success":"true",
"total":"49",
"result":null,
"summary":{
"one_summary":{
"totalQR":2000.0,
"totalQA":1500.0,
"totalMR":1000.0,
"totalMA":500.0
}
}
}
主要区别在于一个摘要。这是因为 summary
是一个 map
,而 maps
每个 entryset
需要一个 key
。这意味着 summary
是您的地图,它有一个 one_summary
键。
我怎样才能像这样转换 JSON 字符串:
{ "summary": {
"totalMR":4.599000000000903E12,
"totalMA":1.9174920000386694E11,
"totalQA":5.1111111181E9,
"totalQR":1.000020666115264E11
},
"result": [{},{}],
"success":"true",
"total":49
}
到 Java 对象。我浏览了许多类似的帖子并实现了构造函数,但找不到正确的解释为什么我无法反序列化 JSON.
我做错了什么吗?
我的Class:
public class expResponse {
private String success;
private String total;
private ArrayList<LinkedHashMap<String,Object>> result;
private LinkedHashMap<String,SummaryResponse> summary;
// Constructor: public expResponse(){}
// Getter and Setter
}
public class SummaryResponse {
private Float totalQR;
private Float totalQA;
private Float totalMR;
private Float totalMA;
public SummaryResponse(){}
// Setter and Getter
}
我的代码:
private expResponse processResult(String result) throws IOException{
ObjectMapper objectMapper = new ObjectMapper();
expResponse expResponseObj =
objectMapper.readValue(result, expResponse.class);
return expResponseObj;
是不是不能反序列化的SummaryResponse?
我猜你的属性应该同名 "totalMR", "totalMA"... 或者你应该使用注释 JsonProperty(value="totalMR") 等等。
您发布的 json 不会反序列化为 SummaryResponse 对象的映射,而是一个单独的 SummaryResponse 对象。要使您的绑定工作,您必须 json 看起来像这样:
{
...
'summary': {
'summary1': {"totalMR":4.599000000000903E12,"totalMA":1.9174920000386694E11,"totalQA":5.1111111181E9,"totalQR":1.000020666115264E11}
'summary2': {"totalMR":4.599000000000903E12,"totalMA":1.9174920000386694E11,"totalQA":5.1111111181E9,"totalQR":1.000020666115264E11}
}
...
}
或者,如果您需要使您的 Java class 符合您提供的 json,您只需更改摘要声明:
private SummaryResponse summary;
您 json 中的字段摘要是 SummaryResponse 类型的对象,而不是 LinkedHashMap。
public class ExpResponse {
private String success;
private String total;
private ArrayList<LinkedHashMap<String,Object>> result;
private Summary summary;
}
我认为您的代码没有问题。您的输入失败,因为它的格式不正确。如果您尝试将具有相同值的对象中的相同值写入字符串,您会得到如下内容:
{
"success":"true",
"total":"49",
"result":null,
"summary":{
"one_summary":{
"totalQR":2000.0,
"totalQA":1500.0,
"totalMR":1000.0,
"totalMA":500.0
}
}
}
主要区别在于一个摘要。这是因为 summary
是一个 map
,而 maps
每个 entryset
需要一个 key
。这意味着 summary
是您的地图,它有一个 one_summary
键。