繁体   English   中英

Java Jackson 反序列化

[英]Java Jackson Deserialization

我努力寻找使用fasterxml.jackson将以下结构反序列化为java对象的方法。

显然“NewYork”和“Boston”是键,而不是我必须解组到映射中的模式

Map<String, Object> jsonMap = mapper.readValue(jsonString,
                    new TypeReference<Map<String,Object>>(){});

但是jsonMap返回的是LinkedHashMap,key是“NewYork”,value是另一个LinkedHashMap。 在第二个内部映射中,key 是“schedules”,value 是 LinkedHashMap 的列表。 第三个内图,key,value分别是“date”:“2020-10-31”,“flightNo”:“UA110”,“depart”:“17:30PM”

我想要的是这样的java模型

public class FlightInfo {

   Map<String, List<Schedule>> info;
}

搜索了一下,想到了JsonNode,Json节点肯定知道属性名,就我而言,NewYork和Boston都没有确定。

我找不到办法做到这一点。

{
  "NewYork": {
    "schedules": [
      {
        "date": "2020-10-31",
        "flightNo": "UA110",
        "depart": "17:30PM"
      },
       {
        "date": "2020-11-01",
        "flightNo": "UA230",
        "depart": "18:30PM"
      }
    ]
  },
 "Boston": {
    "schedules": [
      {
        "date": "2020-11-01",
        "flightNo": "AM110",
        "depart": "08:00AM"
      },
       {
        "date": "2020-11-01",
        "flightNo": "CA230",
        "depart": "10:30AM"
      }
    ]
  }
}

谢谢

JSON 字符串不适合您预期的数据模型Map<String,Object>Map<String, List<Schedule>> 实际上有两个级别的映射, NewYork -> schedules -> List Of Schedule

所以我们应该使用下面的 TypeReference 和二级 Map 来做反序列化

mapper.readValue(jsonString, new TypeReference<Map<String, Map<String, List<Schedule>>>>(){});

当然,如果你坚持使用一级映射,你可以修改数据,如下所示。 因此我们可以使用一个简单的版本TypeReference<Map<String, List<Schedule>>>

{
  "NewYork": [
      {
        "date": "2020-10-31",
        "flightNo": "UA110",
        "depart": "17:30PM"
      },
       {
        "date": "2020-11-01",
        "flightNo": "UA230",
        "depart": "18:30PM"
      }
 ],
 "Boston": [
      {
        "date": "2020-11-01",
        "flightNo": "AM110",
        "depart": "08:00AM"
      },
       {
        "date": "2020-11-01",
        "flightNo": "CA230",
        "depart": "10:30AM"
      }
    ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM