GAEのサーブレットでList<Video>
をシリアル化できますが、逆シリアル化できません。私は何を間違えていますか?
これは、GAEの私のクラスビデオであり、シリアル化されています。
package legiontube;
import Java.util.Date;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Video {
@PrimaryKey
private String id;
@Persistent
private String titulo;
@Persistent
private String descricao;
@Persistent
private Date date;
public Video(){};
public Video(String id, String titulo, String descricao, Date date) {
//super();
this.id = id;
this.titulo = titulo;
this.descricao = descricao;
this.date = date;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
これは、他のアプリケーションの私のクラスのビデオで、逆シリアル化しようとしています:
package classes;
import Java.util.Date;
public class Video {
private String id;
private String titulo;
private String descricao;
private Date date;
public Video(String id, String titulo, String descricao, Date date) {
//super();
this.id = id;
this.titulo = titulo;
this.descricao = descricao;
this.date = date;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
Gsonを使用すると、次のような操作を行うだけで済みます。
List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());
また、デシリアライズするVideo
クラスに引数なしのコンストラクターを提供する必要があります。
別の方法は、配列を型として使用することです、例えば:
Video[] videoArray = gson.fromJson(json, Video[].class);
この方法により、Typeオブジェクトでのすべての面倒を回避できます。リストが本当に必要な場合は、常に配列をリストに変換できます。
List<Video> videoList = Arrays.asList(videoArray);
私見これははるかに読みやすいです。
このワンライナーをお試しください
List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));
警告:Arrays.asList
によって返されるvideos
のリストは不変です。新しい値を挿入することはできません。
参照:
json
はJsonElement
、Reader
、またはString
タイプの場合があります)@DevNGが提供する回答を慎重に使用してください。 Arrays.asList()は、add()、delete()などの便利なメソッドを実装しないArrayListの内部実装を返します。これらを呼び出すと、UnsupportedOperationExceptionがスローされます。実際のArrayListインスタンスを取得するには、次のように記述する必要があります。
List<Video> = new ArrayList<>(Arrays.asList(videoArray));
Jackson JSON Java Parserは非常に人気があり、Springフレームワークで使用されています
import Java.io.IOException;
import Java.io.StringWriter;
import Java.util.List;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public static <T> T jsonStringToObjectArray(String jsonString, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException {
T obj = null;
ObjectMapper mapper = new ObjectMapper();
mapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
obj = mapper.readValue(jsonString, mapper.getTypeFactory().constructCollectionType(List.class, clazz));
return obj;
}