Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Json Datei parsen » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Json Datei parsen
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Json Datei parsen Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
13.04.2015 13:24 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
15.04.2015 20:09 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
16.04.2015 12:38 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Matze84
Eroberer


Dabei seit: 14.10.2012
Beiträge: 73

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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....?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Matze84: 16.04.2015 13:08.

16.04.2015 12:52 Matze84 ist offline Beiträge von Matze84 suchen Nehmen Sie Matze84 in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Json Datei parsen