2016-11-23 9 views
0
HashSet<Skill> tmp = new HashSet<Skill>(); 
    tmp.add(Skill.WOODCUTTING); 
    tmp.add(Skill.FIREMAKING); 
    String j; 
    System.out.println(j = new GsonBuilder().create().toJson(tmp)); 
    System.out.println(new GsonBuilder().create().fromJson(j, HashSet.class)); 
    for (Object e : new GsonBuilder().create().fromJson(j, HashSet.class)) { 
     System.out.println(e.getClass()); 
     System.out.println(e.toString()); 
    } 

スキルがenumはそうのように定義された文字列として、それをデシリアライズ:GSONが正しく列挙型をシリアル化ですが、

@SerializedName("w") WOODCUTTING("Woodcutting"), 
@SerializedName("m") MINING("Mining"), 
@SerializedName("f") FISHING("Fishing"), 

上記のコードの出力:

[11:04:18 INFO]: ["fir","w"] 
[11:04:18 INFO]: [w, fir] 
[11:04:18 INFO]: class java.lang.String 
[11:04:18 INFO]: false 
[11:04:18 INFO]: w 
[11:04:18 INFO]: class java.lang.String 
[11:04:18 INFO]: false 
[11:04:18 INFO]: fir 

することができますようにそれはまずGsonを適切に構築しますが、列挙型ではなく文字列として逆直列化するように見えます。私はここで何が起こっているのか少し失われています - デフォルトでGsonによってサポートされている列挙型ではありませんか?

また、列挙型のシリアル化/逆シリアル化を行うTypeAdapterFactoryの登録も試みました。作成するTypeAdapterのwrite()メソッドは呼び出されますが、read()メソッドは決して呼び出されません。

+0

Java Beanを作成し、その中に逆シリアル化してみます。さもなければ、これはうまくいかず、gsonはその文字列があなたのEnumであると理解できません。 –

+0

申し訳ありませんが、私はJava Beanという用語にあまり慣れていません。それは、私の列挙型の1つの変数を持つクラスを作成し、それを逆シリアル化するということですか? GsonのJavaDocによると、 "Gsonは、Enum、Map、URL、URI、Locale、Date、BigDecimal、およびBigIntegerクラスのデフォルトの直列化と非直列化を提供しています。デフォルトの表現を変更したい場合は、 GsonBuilder.registerTypeAdapter(Type、Object)を通して。 "なぜ私は余分なステップを経なければならないのですか? – misaka

答えて

1

以下は、Gsonで列挙型デシリアライズを行う適切な方法です。

List<Skill> items = new Gson().<List<Skill>>fromJson(json, new TypeToken<List<Skill>>(){}.getType()) 
+0

素晴らしい答えは –

+0

私のために働いた、ありがとう!ちなみに、どこに私がこのものを読むことができるのですか?私はドキュメントに関するそのような情報を見つけられませんでした..その構文はかなり珍しいですし、私はそれが私自身でそれを考え出したとは思わない! – misaka

+0

http://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/Gson.html – xenteros

関連する問題