json сбой десериализации для допустимого формата - PullRequest
0 голосов
/ 30 января 2020

У меня есть json файл с такой датой:

{
...
  "dob":"20001010",
  "registerdate":"20001010121212",
...
}

, которую я использую в классе:

public class User implements Serializable {
... some other
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMdd
    public java.util.Date dob; // this works

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMddHHmmss")
    public java.util.Date registerdate;
}

, затем в моем тесте я использую Gson для преобразования file

User user = new Gson().fromJson("user.json", User.class);

, но при этом я получаю:

com.google.gson.JsonSyntaxException: 20001010121212

Я работаю с: yyyyMMddHHmmss или YYYYMMddHHmmss или YYYYMMDDHHmmss те же результаты

pom:

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>

Ответы [ 2 ]

1 голос
/ 30 января 2020

В основном com.google.gson.Gson не распознает аннотацию com.faster xml .jackson.annotation.JsonFormat (две разные библиотеки)

Вот еще одно решение, использующее только ObjectMapper от xml lib

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.Serializable;
import java.util.Date;

public class DemoApplication {
    public static void main(String[] args) throws JsonProcessingException {
        String json = "{\"dob\":\"20001010121212\"}";
        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(json, User.class);
        System.out.println(user.dob);
    }
}

class User implements Serializable {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMddHHmmss")
    public Date dob;
}
1 голос
/ 30 января 2020

Если вы используете GSON, вам нужно проанализировать дату что-то вроде

import java.util.Date;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GSONExample {

    private static String json = "{\r\n" + "  \"dob\":\"20001010121212\"\r\n" + "}";

    public static void main(String[] args) {
        Gson gson = new GsonBuilder().setDateFormat("yyyyMMddHHmmss").create();
        ItemDob itemDob = gson.fromJson(json, ItemDob.class);
        System.out.println(itemDob.getDob());
    }

}

class ItemDob {
    private Date dob;

    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }
}

Вывод

Вт 10 октября 12:12:12 IST 2000

РЕДАКТИРОВАТЬ Если вы хотите указать форматы даты с помощью аннотаций, используйте Джексон. Например,

import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonExample {

    private static String json = "{\r\n" + 
            "  \"dob\": \"20001010121212\"\r\n" + 
            "}";

    public static void main(String[] args) throws JsonMappingException, JsonProcessingException {
        ItemDob itemDob = new ObjectMapper().readValue(json, ItemDob.class);
        System.out.println(itemDob.getDob());
    }

}

class ItemDob {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMddHHmmss")
    private Date dob;

    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }
}

Выход:

Вт 10 октября 17:42:12 IST 2000

...