2017-10-25 1 views
0

Ich benutze GSON heute zum ersten Mal. Im Moment versuche ich, eine Klasse mit Werten zu deserialisieren und zu serialisieren. Deserialise funktioniert tadellos, aber beim Laden gibt es nur alle Felder als null aus. Ich möchte wirklich wissen, was ich falsch mache oder warum es nicht funktioniert.GSON setzt alle Felder auf null

Klasse gefüllt werden:

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); 
    } 
} 

Saving Code:

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 Inhalt wurde von dieser Methode erstellt!

Loading Code:

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 Inhalt:

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

Ihre Methode macht nichts mit den deserialisierten Objekten. Also was genau ist null? Siehe auch https://google.github.io/gson/apidocs/com/google/gson/Gson.html#fromJson-java.io.Reader-java.lang.Class- –

+0

Ofc tut alles. Er liest die Datei und gibt die JSON-Zeichenfolge an Gson aus, damit sie den Variablen Werte zuweisen kann. Nun, alles ist null. UUID ist null, skillType ist null und die Ebene ist null. Sie können sehen, dass diese Objekte in der .json-Datei vorhanden sind. Das Speichern, das den Inhalt der JSON-Datei erstellt hat, funktioniert auch. – FurtherV

Antwort

1

Als Steve Bishop sagte oder versucht zu sagen pflegt, wird der Rückgabewert aus dem gson.fromJson Methodenaufruf in loadPlayerData nicht. Wenn Sie die PlayerData-Objekte in einer statischen Variablen speichern möchten, können Sie dies nicht im Konstruktor der PlayerData-Klasse für jeden einzelnen tun, da GSON höchstwahrscheinlich zuerst den Konstruktor aufruft und dann die Variablen mit den übereinstimmenden Feldern aus Ihrer JSON-Zeichenfolge füllt durch Reflexion, die zu Ihren Nullfeldern führt.

Was Sie tun müssen, ist die deserialized JSON von gson.fromJson und setzen Sie das in Ihre statische PlayerData.playerDataMap Feld, die offensichtlich mindestens einen öffentlichen Setter benötigt.

0

Ihre Felder sind privat, Gson Karten nur öffentliche Felder standardmäßig.

+0

Ich werde alle Felder als public.I getestet, aber mein Problem besteht immer noch. Es lädt alle Werte als null. – FurtherV

0

Sie haben die Ergebnisse nicht gespeichert.

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

Kann ich diese Ergebnisse nicht in der PlayerData-Klasse in einer statischen HashMap oder Liste speichern? Weil ich das schon mache. – FurtherV

Verwandte Themen