3

Spring フレームワークを使用して、GET リクエストから JSON を受け取ります。間違った値がDBに入れられ、これが起こるまで、すべてがうまくいきました:

02-25 14:46:04.035: E/AndroidRuntime(12271): org.springframework.http.converter.HttpMessageNotReadableException: JSON を読み取れませんでした: 文字列値 '-3600' から java.util.Date のインスタンスを構築できません: ない有効な表現 (エラー: 日付値 '-3600' の解析に失敗しました: 日付 "-3600" を解析できません: 標準形式のいずれとも互換性がありません ("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"))

読み取れない/解析できない値を無視するようにジャクソンを設定するにはどうすればよいですか? 完全なjson解析が失敗するよりもむしろnullかそうです...

これが解析しようとするオブジェクトです。コードでjsonignorepropertiesを使用してプロパティを無視しようとしたことがわかります。

レシート:

public class Receipt {

    public String categories;


    @JsonProperty("expiration_date")
    public Date expirationDate;

    public String image1;

    public String image2;
(..  more properties, getters and setters ..)

そして、どのように解析しようとしています:

RestTemplate restTemplate = new RestTemplate();


    // instellen dat de converter ongedefineerde parameters negeert
    HttpMessageConverter customconver = new MappingJackson2HttpMessageConverter();
    ((MappingJackson2HttpMessageConverter) customconver).getObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //here the ignore unknown

    restTemplate.getMessageConverters().add(customconver);
    restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
    try {
    // GET Request
    ResponseEntity<ReceiptMessage> response = restTemplate.exchange(urlPath, HttpMethod.GET,requestEntity,ReceiptMessage.class);

-3600 値の前に私のパーサーは正常に動作していたので、問題はありません。

この種のエラーを無視する方法はありますか?

4

1 に答える 1

-1

という設定がありObjectMapperますWRITE_DATES_AS_TIMESTAMPS。これにより、日付が文字列ではなく long としてシリアル化されるため、無効にして文字列を取得します。これを最も確実に読む必要があります: http://wiki.fasterxml.com/JacksonFAQDateHandling

それをしたくない場合、何らかのロジックに基づいてフィールドを無視するには、時間がかかる日付フィールドのセッターを追加して、自分で解析してください。@JsonSetter("expiration_date")ジャクソンがそこに渡すことを知っているように、おそらくそれに注釈を付ける必要があります。

最後に、Java の日付/カレンダー API は、一般的に完全に恐ろしいものであると認識されており、可能な限り回避する必要があります。Java 8 を使用している場合は、新しい日付/時刻 API の方がはるかに優れています。Java 8 より前の場合は、JodaTimeを使用してください。それを処理するための特別な Jackson モジュールさえあります。

于 2015-03-17T13:54:18.213 に答える