java - Gson反序列化跳过一个引号
问题描述
我必须反序列化JSON
。我GSON
为此目的使用库。我正在构建一个 Web 应用程序。用户填写他想飞的地方,然后将查询发送到API
并返回结果。
让我们使用一个响应示例:
{"success":true,"data":{"WAW":{"0":{"price":153,"airline":"LO","flight_number":678,"departure_at":"2019-08-05T17:40:00Z","return_at":"2019-08-20T14:35:00Z","expires_at":"2019-05-24T20:55:02Z"},"1":{"price":126,"airline":"A3","flight_number":881,"departure_at":"2019-11-21T11:00:00Z","return_at":"2019-11-26T16:05:00Z","expires_at":"2019-05-27T13:39:23Z"},"2":{"price":171,"airline":"KL","flight_number":900,"departure_at":"2019-09-12T02:40:00Z","return_at":"2019-09-18T17:30:00Z","expires_at":"2019-05-27T10:40:40Z"},"3":{"price":235,"airline":"B2","flight_number":972,"departure_at":"2019-06-12T07:20:00Z","return_at":"2019-06-18T17:30:00Z","expires_at":"2019-05-26T12:31:22Z"},"4":{"price":596,"airline":"TK","flight_number":422,"departure_at":"2019-06-20T00:10:00Z","return_at":"2019-06-24T13:05:00Z","expires_at":"2019-05-26T08:08:21Z"}}},"error":null,"currency":"EUR"}
我以这种方式创建了一个类:http: //pojo.sodhanalibrary.com
问题是总是有到达地的名字。在这种情况下WAW = Warsaw
。
gsonConvert.gson(output).getData().getWAW().getFirst().getAirline()
我想避免它,因为到达地点将取决于用户的选择。
解决方案
您应该能够简化您的data
属性以键入:Map<String, Map<String, Flight>>
. whereFlight
POJO
代表给定的飞行。模型可能如下所示:
class FlightResponse {
private boolean success;
private Map<String, Map<String, Flight>> data;
private String error;
private String currency;
public Map<String, Flight> getFlatData() {
return data.entrySet()
.stream()
.collect(HashMap::new, (m, e) -> m.putAll(e.getValue()), Map::putAll);
}
// getters, setters, toString
}
class Flight {
private BigDecimal price;
private String airline;
@SerializedName("flight_number")
private int flightNumber;
@SerializedName("departure_at")
private String departureAt;
@SerializedName("return_at")
private String returnAt;
@SerializedName("expires_at")
private String expiresAt;
// getters, setters, toString
}
以及如何解析您的示例JSON
:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;
import java.io.File;
import java.io.FileReader;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
public class GsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
Gson gson = new GsonBuilder().create();
FlightResponse flightResponse = gson.fromJson(new FileReader(jsonFile), FlightResponse.class);
flightResponse.getFlatData().forEach((k, v) -> {
System.out.println(k + " => " + v);
});
}
}
上面的代码打印:
0 => Flight{price=153, airline='LO', flightNumber=678, departureAt='2019-08-05T17:40:00Z', returnAt='2019-08-20T14:35:00Z', expiresAt='2019-05-24T20:55:02Z'}
1 => Flight{price=126, airline='A3', flightNumber=881, departureAt='2019-11-21T11:00:00Z', returnAt='2019-11-26T16:05:00Z', expiresAt='2019-05-27T13:39:23Z'}
2 => Flight{price=171, airline='KL', flightNumber=900, departureAt='2019-09-12T02:40:00Z', returnAt='2019-09-18T17:30:00Z', expiresAt='2019-05-27T10:40:40Z'}
3 => Flight{price=235, airline='B2', flightNumber=972, departureAt='2019-06-12T07:20:00Z', returnAt='2019-06-18T17:30:00Z', expiresAt='2019-05-26T12:31:22Z'}
4 => Flight{price=596, airline='TK', flightNumber=422, departureAt='2019-06-20T00:10:00Z', returnAt='2019-06-24T13:05:00Z', expiresAt='2019-05-26T08:08:21Z'}
也可以看看:
推荐阅读
- symfony - EasyAdmin 将用户显示为“未命名”,即使已登录
- docker - 如何在 docker 模块的 ansible 中修复“获取服务器 API 版本时出错”
- reactjs - 重定向到反应js中的外部url时如何在标头中发送令牌?
- apache-spark - 如何将火花流应用程序的输出写入单个文件
- html - CSS 缩放和变换使文本模糊
- javascript - 根据到达日期和程序持续时间计算出发日期
- php - Wordpress/WoOCommerce 更改了 search-slug:想要搜索/显示特定自定义类型的结果
- flyway - 如何在flyway中编辑现有的sql文件
- javascript - 如何在 React 的组件范围之外使用 React 的上下文 API:ReactJS
- node.js - 使用支持中间件的 rxjs 易于遵循 redux 核心?