有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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()

我想避免它,因为到达的地点将取决于用户的选择


共 (1) 个答案

  1. # 1 楼答案

    您应该能够将data属性简化为:Map<String, Map<String, Flight>>。其中FlightPOJO表示给定的航班。模型可以如下所示:

    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'}
    

    另见: