RestTempleteを使用してREST APIからjsonデータを取得し、Gsonを使用してjson形式からオブジェクトへのデータを解析しています
Gson gson = new Gson();
restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new GsonHttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
List<Appel> resultList = null;
resultList = Arrays.asList(restTemplate.getForObject(urlService, Appel[].class));
しかし、Dateでこの問題が発生します。どうすればよいですか。
Could not read JSON: 1382828400000; nested exception is com.google.gson.JsonSyntaxException: 1382828400000
本体に他のpojoが含まれている私のPojo
public class Appel implements Serializable {
private Integer numOrdre;
private String reference;
private String objet;
private String organisme;
private Double budget;
private Double caution;
private Date dateParution;
private Date heureParution;
private Date dateLimite;
private Date heureLimite;
private List<Support> supportList;
private Ville villeid;
private Categorie categorieid;
public Appel() {
}
public Appel(Integer numOrdre, String reference, String objet, String organisme, Date dateParution, Date heureParution, Date dateLimite) {
this.numOrdre = numOrdre;
this.reference = reference;
this.objet = objet;
this.organisme = organisme;
this.dateParution = dateParution;
this.heureParution = heureParution;
this.dateLimite = dateLimite;
}
これは私のAPIによって返されたjsonです
[
{
"numOrdre": 918272,
"reference": "some text",
"objet": "some text",
"organisme": "some text",
"budget": 3000000,
"caution": 3000000,
"dateParution": 1382828400000,
"heureParution": 59400000,
"dateLimite": 1389657600000,
"heureLimite": 34200000,
"supportList":
[
{
"id": 1,
"nom": "some text",
"dateSupport": 1384732800000,
"pgCol": "013/01"
},
{
"id": 2,
"nom": "some text",
"dateSupport": 1380236400000,
"pgCol": "011/01"
}
],
"villeid":
{
"id": 2,
"nom": "Ville",
"paysid":
{
"id": 1,
"nom": "Pays"
}
},
"categorieid":
{
"id": 1,
"description": "some text"
}
},
.....
]
私が最後にやったことは私のAPIプロジェクトに行き、CustomSerializerを作成することです
public class CustomDateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date t, JsonGenerator jg, SerializerProvider sp) throws IOException, JsonProcessingException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(t);
jg.writeString(formattedDate);
}
}
形式yyyy-MM-ddを返し、日付フィールドに次の注釈を付けました
@JsonSerialize(using = CustomDateSerializer.class)
私のAndroidアプリケーションで、私はGsonオブジェクトを
Reader reader = new InputStreamReader(content);
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setDateFormat("yyyy-MM-dd");
Gson gson = gsonBuilder.create();
appels = Arrays.asList(gson.fromJson(reader, Appel[].class));
content.close();
それは今のところ機能します..あなたの助けをありがとう
カスタムシリアライザーは不要になりました。GsonBuilderを使用して、日付形式を指定するだけです。
Timestamp t = new Timestamp(System.currentTimeMillis());
String json = new GsonBuilder()
.setDateFormat("yyyy-MM-dd hh:mm:ss.S")
.create()
.toJson(t);
System.out.println(json);
1382828400000
値はlong(ミリ秒単位の時間)です。フィールドがGSON
であり、Date
をlong
に自動的に変換できないことをDate
に伝えています。
フィールドを長い値として指定する必要があります
private long dateParution;
private long heureParution;
private long dateLimite;
private long heureLimite;
GSON
がJSON文字列を目的のAppel
クラスインスタンスにキャストした後、それらのフィールドを日付として使用して別のオブジェクトを作成し、新しいオブジェクトに値を割り当てるときにそれらを変換します。
別の代替手段は、独自のカスタムデシリアライザを実装することです。
public class CustomDateDeserializer extends DateDeserializer {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
// get the value from the JSON
long timeInMilliseconds = Long.parseLong(jsonParser.getText());
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeInMilliseconds);
return calendar.getTime();
}
}
次のように、このカスタムデシリアライザをセッターメソッドで必要なフィールドに設定する必要があります。
@JsonDeserialize(using=CustomDateDeserializer.class)
public void setDateParution(Date dateParution) {
this.dateParution = dateParution;
}