2017-10-25 7 views
0

今日は初めてGSONを使用しています。今、私は値を持つクラスを非直列化してシリアライズしようとしています。 Deserialiseは完璧に動作しますが、ロードするとすべてのフィールドがnullとして出力されます。私は本当に何が間違っているのか、なぜそれがうまくいかないのかを知りたいです。GSONはすべてのフィールドをヌルに設定します

クラス充填する:

public class PlayerData { 

    private static Map<UUID, PlayerData> playerDataMap = new HashMap<UUID, PlayerData>(); 
    public UUID uuid; 
    public Integer kills; 
    public Integer level; 
    public Integer xp; 
    public SkillType skillType; 

    public PlayerData() { 
     playerDataMap.put(getUUID(), this); 
     String logString = "[DEBUG] " + uuid + " " + skillType + " " + level; 
     ZombieSurvival.getInstance().getLogger().info(logString); 
    } 
} 

保存コード:

private synchronized void savePlayerData(){ 
    try { 
     Map<UUID, PlayerData> map = PlayerData.getPlayerDataMap(); 
     Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
     String seperator = File.separator; 
     String path = getDataFolder().getAbsolutePath() + seperator + "PlayerData" + seperator; 
     File folder = new File(path); 
     folder.mkdirs(); 
     for(UUID uuid : map.keySet()){ 
      PlayerData pd = map.get(uuid); 
      String json = gson.toJson(pd); 
      File myFile = new File(folder,uuid.toString() + ".json"); 
      myFile.createNewFile(); 
      FileOutputStream fOut = new FileOutputStream(myFile); 
      OutputStreamWriter myOutWriter =new OutputStreamWriter(fOut); 
      myOutWriter.append(json); 
      myOutWriter.close(); 
      fOut.close(); 
     } 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

INFO:JSONコンテンツは、この方法で作成されました!

ロードコード:コンテンツ

private void loadPlayerData() { 
    try { 
     //Setup GSON Loading 
     String seperator = File.separator; 
     File invasionMobFolder = new File(getDataFolder() + seperator + "PlayerData" + seperator); 
     invasionMobFolder.mkdirs(); 
     File[] listOfFiles = invasionMobFolder.listFiles(); 
     for (File file : listOfFiles) { 
      if (file.getName().endsWith(".json")) { 
       FileInputStream fIn = new FileInputStream(file); 
       BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn)); 
       String aDataRow = ""; 
       String aBuffer = ""; //Holds the text 
       while ((aDataRow = myReader.readLine()) != null) { 
        aBuffer += aDataRow; 
       } 
       myReader.close(); 
       Gson gson = new Gson(); 
       gson.fromJson(aBuffer, PlayerData.class); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

JSON:

{ 
    "uuid": "ba79c71f-aa2c-4f8b-a7e5-d6bfea7a4dcc", 
    "kills": 0, 
    "level": 0, 
    "xp": 0, 
    "skillType": "KNIGHT" 
} 
+0

メソッドは、逆シリアル化されたオブジェクトでは何も行いません。だから、どういう意味でヌルですか?また、https://google.github.io/gson/apidocs/com/google/gson/Gson.html#fromJson-java.io.Reader-java.lang.Class- –

+0

こちらをご覧ください。ファイルを読み込んでgsonにjson Stringを渡し、変数に値を渡すことができます。まあすべてがnullです。 UUIDはnull、skillTypeはnull、レベルはnullです。それらのオブジェクトが.jsonファイルに存在することがわかります。 jsonファイルの内容を作成した保存も機能します。 – FurtherV

答えて

1

スティーブ・ビショップが言ったかと言うことを試みたとして、loadPlayerDatagson.fromJsonメソッド呼び出しからの戻り値が使用されていません。 PlayerDataオブジェクトを静的変数に保存する場合は、GSONがまずコンストラクタを呼び出してから、その変数をjson文字列の一致するフィールドで埋めるため、PlayerDataオブジェクトを静的変数に保存する場合は、それぞれのPlayerDataクラスのコンストラクタで行うことはできませんあなたのヌルで埋められたフィールドに反映されます。

デシリアライズされたJSONをgson.fromJsonから取得し、それをあなたの静的なPlayerData.playerDataMapフィールドに置き、明らかに少なくともパブリックセッターを必要とするものです。

0

あなたのフィールドはプライベートで、GSONはデフォルトで唯一の公共のフィールドをマッピングします。

+0

すべてのフィールドを公開します。私はそれをテストしましたが、私の問題は依然として存在します。すべての値をnullとしてロードします。 – FurtherV

0

結果を保存しませんでした。

private List<PlayerData> loadPlayerData(){ 
    List<PlayerData> players = new ArrayList<>(); 
    try { 
     //Setup GSON Loading 
     String seperator = File.separator; 
     File invasionMobFolder = new File(getDataFolder() + seperator + "PlayerData" + seperator); 
     invasionMobFolder.mkdirs(); 
     File[] listOfFiles = invasionMobFolder.listFiles(); 
     for(File file : listOfFiles){ 
      if(file.getName().endsWith(".json")){ 
       FileInputStream fIn = new FileInputStream(file); 
       BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn)); 
       String aDataRow = ""; 
       String aBuffer = ""; //Holds the text 
       while ((aDataRow = myReader.readLine()) != null) 
       { 
        aBuffer += aDataRow ; 
       } 
       myReader.close(); 
       Gson gson = new Gson(); 
       players.add(gson.fromJson(aBuffer, PlayerData.class)); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return players; 
} 
+0

静的なHashMapやListのように、PlayerDataクラスの結果を保存できませんか?私はすでにそれをしているから。 – FurtherV

関連する問題