Json Datei parsen

Neue Frage »

Auf diesen Beitrag antworten »
Matze84 Json Datei parsen

Hallo zusammen.
Ich hab mal wieder ein Problem und hoffe das ich hier damit im richtigen TeilForum bin.

Ich möchte gern eine *.json Datei mit Java parsen.
Bei dem Json-File handelt es sich um ein SaveGame.
Das json-File sei hier nur schematisch dargestellt.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
{ 	
{"Persistent" : {
	"TerrainGeneration" : {
 		"playerPosition" : {
 			"x" : "~f-14.20577",
			"y" : "~f2.453131",
			"z" : "~f-24.77582" 	
		},
 	       "worldSeed" : "~i91734203",
		"WorldOriginPoint" : {
 			"x" : "~f0",
			"y" : "~f0", 
			"z" : "~f0" 	
		},
           .........
           .........
        },
        "PlayerCrafting" : {
 			"discoveredItems" : {
				"[0]Item" : "CRAFTING_STICK_LOG",
 				"[1]Item" : "EASTEREGG_WOLLIE",
				 "[2]Item" : "ANIMALS_CRAB",
				 "[3]Item" : "CRAFTING_STICK",
				"[4]Item" : "BASE",
				"[5]Item" : "CRAFTING_FIRE",
				"[6]Item" : "CRAFTING_ROCK",
				"[7]Item" : "TOOLS_ROPE",
				"[8]Item" : "TOOLS_CRUDE_AXE",
				"[9]Item" : "FOOD_COCONUT_GREEN",
				"[10]Item" : "FOOD_COCONUT",
				"[11]Item" : "FOOD_COCONUT_DRINKABLE",
				"[12]Item" : "TOOLS_CRUDE_HAMMER",
				"[13]Item" : "BUILDING_FOUNDATION_RAFT",
				"[14]Item" : "BUILDING_FOUNDATION",
				"[15]Item" : "BUILDING_FOUNDATION_SUPPORT",
				"[16]Item" : "CRAFTING_PALM_LEAF",
				"[17]Item" : "BUILDING_FOUNDATION_WALL"
			}
		},
}
}



Zum parsen benutze ich GSON.
theoretisch klappt das auch alles soweit, bis auf die Stelle mit den "discoveredItems"

Die Klassen, die GSON benötigt, um das in die entsprechenden Objekte zu parsen habe ich angelegt, allerdings hab ich halt die schwierigkeiten mit diesem "[0]Item" etc.

Es sieht zwar aus wie eine Liste, ist es aber leider nicht. sondern leider eher eine Ansammlung von Strings.
Es gibt noch 2 andere Stellen, wo ich das Problem das gleiche ist und an den anderen Stellen, kann ich die Anzahl "[x]" nicht vorhersehen.

Vielleicht kann mir da jmd helfen? oder weiß vielleicht einen link, wo ich mich belesen kann.


Vielen Dank schon mal
 
Auf diesen Beitrag antworten »
Karlito

Hallo Matze84,

an so einer Stelle macht sich der bisherige Quelltext ganz nett. Aber vielleicht kannst Du hiermit was anfangen:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;

public class MyJsonParser {public static void main(String[] args) {

        if (args.length == 1){
            try {
                byte[] encoded = Files.readAllBytes(Paths.get(args[0]));
                String content = new String(encoded, Charset.defaultCharset());

                JsonParser parser = new JsonParser();
                JsonObject o = parser.parse(content).getAsJsonObject();

                traverse(o);

            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("Dateipfad muss als Parameter übergeben werden.");
        }
    }

    private static void traverse(JsonObject o){

        for (Map.Entry<String, JsonElement> entry : o.entrySet()) {
            if (entry.getValue().isJsonArray()){
                System.out.println(entry);
            }
            if (entry.getValue().isJsonObject()){
                traverse(entry.getValue().getAsJsonObject());
            } else {
                System.out.println(entry);
            }
        }
    }
}


Gruß,

Karlito
Auf diesen Beitrag antworten »
Matze84

Ok das schau ich mir gern nochmal an.... besonders das mit dem

code:
1:
2:
3:
JsonParser parser = new JsonParser();
JsonObject o =p arser.parse(content).getAsJsonObject();
traverse(o);


Bisher habe ich mir für alles Wrapper Klassen geschrieben Um quasi alles ordentlich abbilden zu können. und dann einfach in GSON reingejagt.

Beispiel:
Persistent-Klasse
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public class Persistent {
	private TerrainGeneration TerrainGeneration;
	private PlayerMovement PlayerMovement;
	private FollowSpawn FollowSpawn;
	private PlayerCrafting PlayerCrafting;
	private PlayerInventory PlayerInventory;
	private PlayerTorch PlayerTorch;
	private PlayerStatistics PlayerStatistics;
	private Atmosphere Atmosphere;
	private StatsManager StatsManager;

	public Persistent() {
	}
} 

Ich weiß dass man VariablenNamen nicht groß schreibt, aber sonst würde er sie im JSON nicht erkennen unglücklich


Für Positionen wie bei:
code:
1:
2:
3:
4:
5:
"playerPosition" : {
 			"x" : "~f-14.20577",
			"y" : "~f2.453131",
			"z" : "~f-24.77582" 	
		}, 

Funktionierte das auch alles....
Allerdings konnte GSON Sachen wie:

"[0]Item" : "CRAFTING_STICK_LOG",

nicht ordentlich erkennen.

Achso nachdem ich die Wrapper Klassen geschrieben hatte,
habe ich mir den Inhalt des Json's als String geholt und dann folgenden Aufruf gemacht.

code:
1:
2:
3:
GSON gson = new GSON();
Persistent p = gson.fromJson(jsonString, Persistent.class); 


Wie gesagt in Teilen hat das geklappt. Nur eben nicht alles.
Auf diesen Beitrag antworten »
Matze84

Ok.....
code:
1:
2:
JsonParser parser = new JsonParser();
JsonObject o =p arser.parse(content).getAsJsonObject(); 



funktioniert schon mal ordentlich... jetzt müsste ich das halt nur durchgehen und entsprechend "auffieseln" (aufteilen) damit ich in Java quasi mein SaveGame Objekt habe, mit dem ich dann arbeiten kann....

EDIT:
Ich würde jetzt quasi das ganze Stück für Stück versuchen in mein SaveGame Objekt, welches eine Persistent enthält etc. zu packen!?

Und da hatte ich gedacht, dass ich immer den "KEY" des jeweiligen Entry's prüfe und dann entsprechend reagiere.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
SaveGame saveGame = new SaveGame();

switch(entry.getKey()){
  case "Persistent":
      Persistent p = new Persistent();
      saveGame.setPersistent(p);
  break;
  case "TerrainGeneration":
      TerrainGeneration tg = new TerrainGeneration();
 ......
......
etc.
}


Aber ich glaube das das einfach unheimlich lang und aufwändig ist.

Gibt es da evtl was sinnvolleres / kürzeres....?
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »