web-dev-qa-db-fra.com

Date de sérialisation JSON dans un format personnalisé (Impossible de construire une instance de Java.util.Date à partir de la valeur String)

could not read JSON: Can not construct instance of Java.util.Date from String 
value '2012-07-21 12:11:12': not a valid representation("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))

passer la requête json à REST dans un POJO class.user doit entrer uniquement au format datetime ci-dessous, sinon il doit envoyer un message. pourquoi DateSerializer n'appelle pas?

add(@Valid @RequestBody User user)
{
}

json:

{
   "name":"ssss",
   "created_date": "2012-07-21 12:11:12"
}

variable de classe pojo

@JsonSerialize(using=DateSerializer.class)
@Column
@NotNull(message="Please enter a date")      
@Temporal(value=TemporalType.TIMESTAMP)
private Date created_date;

public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
    logger.info("serialize:"+value);
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    logger.info("DateSerializer formatter:"+formatter.format(value));
    jgen.writeString(formatter.format(value));
}
27
user739115

J'ai le même problème, donc j'écris une désérialisation de date personnalisée avec @JsonDeserialize(using=CustomerDateAndTimeDeserialize.class)

public class CustomerDateAndTimeDeserialize extends JsonDeserializer<Date> {

    private SimpleDateFormat dateFormat = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");

    @Override
    public Date deserialize(JsonParser paramJsonParser,
            DeserializationContext paramDeserializationContext)
            throws IOException, JsonProcessingException {
        String str = paramJsonParser.getText().trim();
        try {
            return dateFormat.parse(str);
        } catch (ParseException e) {
            // Handle exception here
        }
        return paramDeserializationContext.parseDate(str);
    }
}
16
lbdfcgyjjr

Annotez votre created_date champ avec l'annotation JsonFormat pour spécifier le format de sortie.

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = TimeZone.getDefault(), locale = Locale.getDefault())

Notez que vous devrez peut-être passer dans des paramètres régionaux et une zone horaire différents s'ils doivent être basés sur autre chose que ce que le serveur utilise.

Vous pouvez trouver plus d'informations dans la documentation .

50
Splaktar
  1. Si vous voulez lier une chaîne JSON à ce jour, ce processus est appelé deserialization, pas serialization.
  2. Pour lier une chaîne JSON à ce jour, créez une désérialisation de date personnalisée, annotez created_date Ou son setter avec

    @JsonDeserialize(using=YourCustomDateDeserializer.class)

où vous devez implémenter la méthode public Date deserialize(...) pour dire à Jackson comment convertir une chaîne en date.

Prendre plaisir.

1
khoi nguyen

Encore une autre façon est d'avoir un objet Date personnalisé qui s'occupe de sa propre sérialisation.

Bien que je ne pense pas vraiment que l'extension d'objets simples comme Date, Long, etc. soit une bonne pratique, dans ce cas particulier, cela rend le code facilement lisible, a un seul point où le format est défini et est plutôt plus que moins compatible avec un objet normal Date.

public class CustomFormatDate extends Date {

    private DateFormat myDateFormat = ...; // your date format

    public CustomFormatDate() {
        super();
    }

    public CustomFormatDate(long date) {
        super(date);
    }

    public CustomFormatDate(Date date) {
        super(date.getTime());
    }


    @JsonCreator
    public static CustomFormatDate forValue(String value) {
        try {
            return new CustomFormatDate(myDateFormat.parse(value));
        } catch (ParseException e) {
            return null;
        }
    }

    @JsonValue
    public String toValue() {
        return myDateFormat.format(this);
    }

    @Override
    public String toString() {
        return toValue();
    }
}
0
Dariusz

J'ai résolu cela en utilisant les étapes ci-dessous.

1.Dans la classe d'entité, annotez-le à l'aide de @JsonDeserialize

@Entity
@Table(name="table")
public class Table implements Serializable {
// Some code
@JsonDeserialize(using= CustomerDateAndTimeDeserialize.class)
@Temporal(TemporalType.TIMESTAMP)
@Column(name="created_ts")
private Date createdTs
}
  1. Écrire CustomDateAndTimeDeserialize.Java exemple de code
0
rahulnikhare