将LinkedHashMap <string,myclass>转换为Java Object

时间:2016-05-17 21:08:47

标签: java json casting jackson pojo

如何转换JSON字符串,如下所示:

{ "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;

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我认为你的代码中没有问题。您的输入失败,因为格式不正确。如果您尝试将具有相同值的对象中的相同值写入字符串,则会得到类似的内容:

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

主要区别在于一个总结。这是因为summarymapmapskey需要entryset。这意味着summary是您的地图,其中包含one_summary密钥。

答案 3 :(得分:0)

是否无法反序列化的SummaryResponse?

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