Десериализация LocalDateTime usin Gson не работает - PullRequest
0 голосов
/ 15 октября 2018

Мне нужно преобразовать строку в объект, используя Gson:

gson.fromJson("{\"message\":\"any msg.\",\"individual\":{\"id\":100,\"citizenshipList\":[{\"date\":[2018,10,15,16,29,36,402000000]}]}}", Response.class)

, где

public class Response {
    private String message;
    private Individual individual;
}

public class Individual {
 private Integer id;
 private List<Citizenship> citizenshipList = new ArrayList<>();
}

public class Citizenship {

  @DateTimeFormat(pattern="d::MMM::uuuu HH::mm::ss")
  LocalDateTime date;

}

Я получаю эту ошибку

java.lang.IllegalStateException: ожидалось BEGIN_OBJECT, но было BEGIN_ARRAY в строке 1 столбца 122 путь $ .individual.citizenshipList [0] .date

Я также попытался изменить Gson:

Gson gson1 = new GsonBuilder()
            .registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
                @Override
                public LocalDateTime deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
                    JsonObject jo = json.getAsJsonObject();
                    return LocalDateTime.of(jo.get("year").getAsInt(),
                            jo.get("monthValue").getAsInt(),
                            jo.get("dayOfMonth").getAsInt(),
                            jo.get("hour").getAsInt(),
                            jo.get("minute").getAsInt(),
                            jo.get("second").getAsInt(),
                            jo.get("nano").getAsInt());
                }
            }).create();

но это дает мне эту ошибку:

java.lang.IllegalStateException: Не объект JSON: [2018,10,15,16,29,36,402000000]

1 Ответ

0 голосов
/ 15 октября 2018

Обе опубликованные вами ошибки говорят о проблеме:

Не объект JSON: [2018,10,15,16,29,36,402000000]

Ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY

[2018,10,15,16,29,36,402000000] - это массив JSON , а GSON ожидает объект JSON , например: {}.

Один из способов решить эту проблему - изменить JsonDeserializer, чтобы использовать JsonArray вместо JsonObject:

Gson gson1 = new GsonBuilder()
            .registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
                @Override
                public LocalDateTime deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
                    JsonArray array = json.getJSONArray("date");
                    return LocalDateTime.of(
                                            // Set all values here from
                                            // `array` variable
                                            );
                }
            }).create();
...