将 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 键。