2017-03-20 39 views
-4

残りを使用するjava-eeアプリケーションのテストを行っていますが、gsonでjsonをフォーマットしようとしたときに、次のエラーが発生しました:Gsonはjavaで私のjsonの日付を解析できません

java.text.ParseException: Failed to parse date ["1489752692000']: Invalid time zone indicator '9'

これは私がGson gson = new Gson();と私のGsonを初期化したとき、私は解決策は、カスタムDateDeseriliazerクラスを作成し、このようintializeしたStackOverflowの上this questionを見つけ起こっ:

Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new GsonDateFormatter()).create(); 

ここに私のversiがありますDateDeserializerクラスの上:

public class GsonDateFormatter implements JsonDeserializer<Date> { 

    private final DateFormat dateFormat; 

    public GsonDateFormatter() { 
     dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
     dateFormat.setTimeZone(TimeZone.getTimeZone("CET")); 
    } 

    public synchronized Date deserialize(JsonElement jsonElement,Type type,JsonDeserializationContext jsonDeserializationContext) { 
     try { 
      return dateFormat.parse(jsonElement.getAsString()); 
     } catch (ParseException e) { 
      throw new JsonParseException(e); 
     } 
    } 
} 

しかし、これは唯一にエラーメッセージを変更します。だから私は今、この問題を解決するかどうかは非常にわからないんだけど、私は、誰かが私を助けることができると思います

java.text.ParseException: Unparseable date: "1489752692000"

これとともに。

ありがとうございます。

+1

「新しい日付(jsonElement.getAsLong())」ですか? –

+3

'1489752692000'は明らかに' yyyy-MM-dd'T'HH:mm:ss'Z 'という形式ではないので、なぜその形式を与えましたか? –

+0

@ cricket_007なぜ私はそこに置くべきフォーマットと他のポストがそのフォーマットを使用したか分からなかったので –

答えて

1

エポックから何ミリ秒経過しているように見えますか?

代わりにSimpleDateFormat

import java.time.Instant; 
import java.time.ZonedDateTime; 
import java.timeZoneOffset; 

// ... 

long epoch = Long.parseLong(jsonElement.getAsString()); // Or if you can do jsonElement.getAsLong() 
Instant instant = Instant.ofEpochMilli(epoch); 
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); // 2017-03-17T12:11:32Z 

java.time API now in Java 8を使用することをお勧めします。しかし、いずれにしても、あなたは長い値からDateを返すようにSimpleDateFormatは必要ありません。

public synchronized Date deserialize(JsonElement jsonElement,Type type,JsonDeserializationContext jsonDeserializationContext) { 
    long epoch = jsonElement.getAsLong(); 
    return new Date(epoch); 
} 
+0

これはちょうど@since 1.6 + 'として記述されたAPIの使用法を示していて、' jsonElement.getAsLong();ではなく、十分な赤い線を私に与えてくれますか? –

+0

これで十分です。インポート文はファイルの先頭にあるので、Javaでコンパイルしない限り、他に何が間違っているのか分かりません。 –

+0

インポートはファイルの先頭にあります(赤い線でも) –

関連する問題