Как разобрать такой JSON с Gson? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть JSON с этой структурой:

{
"response": {
    "2018-11-19": [
        {
            "date_end": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "10:30",
                "iso": "2018-11-19T10:30:00",
                "day": "19"
            },
            "date_start": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "08:00",
                "iso": "2018-11-19T08:00:00",
                "day": "19"
            },
            "id": "20181119080000001018"
        },
        {
            "date_end": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "10:30",
                "iso": "2018-11-19T10:30:00",
                "day": "19"
            },
            "date_start": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "09:30",
                "iso": "2018-11-19T09:30:00",
                "day": "19"
            },
            "id": "20181119093000001018"
        },
        {
            "date_end": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "10:30",
                "iso": "2018-11-19T10:30:00",
                "day": "19"
            },
            "date_start": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "10:00",
                "iso": "2018-11-19T10:00:00",
                "day": "19"
            },
            "id": "20181119100000001018"
        },
        {
            "date_end": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "10:30",
                "iso": "2018-11-19T10:30:00",
                "day": "19"
            },
            "date_start": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "10:30",
                "iso": "2018-11-19T10:30:00",
                "day": "19"
            },
            "id": "20181119103000001018"
        }
    ],
    "2018-11-16": [
        {
            "date_end": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "11:15",
                "iso": "2018-11-16T11:15:00",
                "day": "16"
            },
            "date_start": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "10:00",
                "iso": "2018-11-16T10:00:00",
                "day": "16"
            },
            "id": "20181116100000001018"
        },
        {
            "date_end": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "11:15",
                "iso": "2018-11-16T11:15:00",
                "day": "16"
            },
            "date_start": {
                "year": "2018",
                "day_verbose": "Sun",
                "month": "11",
                "month_verbose": "Nov",
                "time": "11:15",
                "iso": "2018-11-16T11:15:00",
                "day": "16"
            },
            "id": "20181116111500001018"
        }
    ]
},
"success": true,
"error": {}
}

Основная сложность в том, что здесь может быть много объектов типа «2018-11-19». И их имена заранее неизвестны. Я могу разобрать поле «success» и объект «Error», но у меня возникли проблемы с объектом «Response». Я получаю «ОК» HTTP-код с нулевым объектом ответа. Я думаю, что с отображением что-то не так. Вот мои классы для картографии:

public class AppointmentListApiResponse extends ApiResponse {

@SerializedName("response")
@Expose
private Response response;
@SerializedName("success")
@Expose
private Boolean success;
@SerializedName("error")
@Expose
private Error error;

// getters and setters

public class Response {

    // I've tried these versions

    //private Map<String, AppointmentInfo> appoints;
    //private Map<String, List<AppointmentInfo>> appoints;
    //private List<List<AppointmentInfo>> appoints;

    // but they don't work for me

    // getters and setters
}

А это класс AppointmentInfo:

public class AppointmentInfo {
@SerializedName("date_start")
@Expose
private Date dateStart;

@SerializedName("date_end")
@Expose
private Date dateEnd;

@SerializedName("id")
@Expose
private String id;

// getters and setters


public class Date {
    @SerializedName("day")
    @Expose
    private String day;

    @SerializedName("day_verbose")
    @Expose
    private String dayVerbose;

    @SerializedName("iso")
    @Expose
    private String dateTime;

    @SerializedName("month")
    @Expose
    private String month;

    @SerializedName("month_verbose")
    @Expose
    private String monthVerbose;

    @SerializedName("time")
    @Expose
    private String time;

    @SerializedName("year")
    @Expose
    private String year;

    // getters and setters
}
}

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Для моделей с фиксированными / статическими ключами создайте, например, POJO -

"date_end": { "year": "2018", "day_verbose": "Sun", "month": "11", "month_verbose": "Nov", "time": "10:30", "iso": "2018-11-19T10:30:00", "day": "19" }

Это может быть сопоставлено с

public class Date_End {
@SerializedName("year")
public String year;
@SerializedName("day_verbose")
public String dayVerbose;
@SerializedName("month")
public String month;
@SerializedName("monthVerbose")
public String monthVerbose;
@SerializedName("time")
public String time;
// and similarly other fields
}

Создание оболочки POJO для Date_END и Date_Start

public class DateStartEndWrapper {
@SerializedName("date_end")
public Date_End dateEnd;
@SerializedName("date_start")
public Date_Start dateStart;
}

Для ваших внешних динамических ключей, таких как "2018-11-19", рассмотрите ответ как карту и проанализируйте его, используя -

Gson gson = new Gson();
Type mapType = new TypeToken<Map<String,DateStartEndWrapper>() {}.getType();
gson.fromJson() // pass the value of response key in here.
0 голосов
/ 10 декабря 2018

Я наконец нашел решение. Класс должен быть таким:

public class AppointmentListApiResponse extends ApiResponse {

     @SerializedName("response")
     private Map<String, List<AppointmentInfo>> response;
     @SerializedName("success")
     private Boolean success;
     @SerializedName("error")
     private Error error;
}

И ему не нужен класс Response внутри. Надеюсь, это кому-нибудь поможет.

0 голосов
/ 07 ноября 2018

модель этого ответа строки json и использование класса APIResponse для анализа строки json с использованием библиотеки gson

public class APIResponse{

@SerializedName("response")
@Expose
public Response response;
@SerializedName("success")
@Expose
public Boolean success;
@SerializedName("error")
@Expose
public Error error;

}

public class Response {

@SerializedName("2018-11-19")
@Expose
public List<com.example._20181119> _20181119 = null;
@SerializedName("2018-11-16")
@Expose
public List<com.example._20181116> _20181116 = null;

}

public class DateEnd {

@SerializedName("year")
@Expose
public String year;
@SerializedName("day_verbose")
@Expose
public String dayVerbose;
@SerializedName("month")
@Expose
public String month;
@SerializedName("month_verbose")
@Expose
public String monthVerbose;
@SerializedName("time")
@Expose
public String time;
@SerializedName("iso")
@Expose
public String iso;
@SerializedName("day")
@Expose
public String day;

}

public class DateEnd_ {

@SerializedName("year")
@Expose
public String year;
@SerializedName("day_verbose")
@Expose
public String dayVerbose;
@SerializedName("month")
@Expose
public String month;
@SerializedName("month_verbose")
@Expose
public String monthVerbose;
@SerializedName("time")
@Expose
public String time;
@SerializedName("iso")
@Expose
public String iso;
@SerializedName("day")
@Expose
public String day;

}

public class DateStart {

@SerializedName("year")
@Expose
public String year;
@SerializedName("day_verbose")
@Expose
public String dayVerbose;
@SerializedName("month")
@Expose
public String month;
@SerializedName("month_verbose")
@Expose
public String monthVerbose;
@SerializedName("time")
@Expose
public String time;
@SerializedName("iso")
@Expose
public String iso;
@SerializedName("day")
@Expose
public String day;

}

public class DateStart_ {

@SerializedName("year")
@Expose
public String year;
@SerializedName("day_verbose")
@Expose
public String dayVerbose;
@SerializedName("month")
@Expose
public String month;
@SerializedName("month_verbose")
@Expose
public String monthVerbose;
@SerializedName("time")
@Expose
public String time;
@SerializedName("iso")
@Expose
public String iso;
@SerializedName("day")
@Expose
public String day;

}

public class Error {


}



public class _20181116 {

@SerializedName("date_end")
@Expose
public DateEnd_ dateEnd;
@SerializedName("date_start")
@Expose
public DateStart_ dateStart;
@SerializedName("id")
@Expose
public String id;

}

public class _20181119 {

@SerializedName("date_end")
@Expose
public DateEnd dateEnd;
@SerializedName("date_start")
@Expose
public DateStart dateStart;
@SerializedName("id")
@Expose
public String id;

}
...