2016-05-17 39 views
-2

我如何转换的JSON字符串是这样的:转换的LinkedHashMap <字符串,MyClass的>到Java对象

{ "summary": { 
    "totalMR":4.599000000000903E12, 
    "totalMA":1.9174920000386694E11, 
    "totalQA":5.1111111181E9, 
    "totalQR":1.000020666115264E11 
    }, 
    "result": [{},{}], 
    "success":"true", 
    "total":49 
} 

Java对象。我经历了许多类似的帖子并实现了构造函数,但找不到解释为什么我无法反序列化JSON的正确解释。

我做错了什么?

我的班级:

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; 
+0

您正在使用哪个JSON库? – Nayuki

+0

@Nayuki Jackson – Jammy

+0

你是什么意思“无法反序列化JSON”?你是否遇到异常?缺失数据?你的电脑是否冒出蓝烟? – dimo414

回答

2

您发布的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类符合您所提供的JSON,你只需要改变的声明总结:

private SummaryResponse summary; 
+0

感谢它的工作! – Jammy

0

难道不能deserialised的SummaryResponse?

我想你的属性应该有相同的名字“totalMR”,“totalMA”....或者你应该使用注释JsonProperty(value =“totalMR”)等等。

+0

这个答案不正确。他的字段名称与他提供的json文档中的字段名称匹配。 – rmlan

+0

在两分钟前编辑的文档:) –

+0

已编辑进行格式设置。内容没有改变。 – rmlan

1

json中的字段摘要是SummaryResponse类型的对象,而不是LinkedHashMap类型的对象。

public class ExpResponse { 
    private String success; 
    private String total; 
    private ArrayList<LinkedHashMap<String,Object>> result; 
    private Summary summary; 
} 
1

我不认为你在代码中有问题。您的输入失败,因为它的格式不正确。如果您尝试从字符串的值相同的对象写相同的值,你喜欢的东西:

{ 
    "success":"true", 
    "total":"49", 
    "result":null, 
    "summary":{ 
     "one_summary":{ 
     "totalQR":2000.0, 
     "totalQA":1500.0, 
     "totalMR":1000.0, 
     "totalMA":500.0 
     } 
    } 
} 

而且主要区别是一个总结。这是因为summarymapmaps需要key每个entryset。这意味着summary是您的地图,它有一个one_summary密钥。

相关问题