GSON-Parser

Kenta1561

Bekanntes Mitglied
Hallo,

ich habe jetzt einigermaßen verstanden, wie man mit GSON eine JSON-Datei in Java-Objekte umwandeln kann, jedoch nur mit einfachen JSON-Dateien, wie zum Beispiel:
JSON:
{
"id": 1,
"name": "Kenta1561",
"hausnummer": 213
}

Nun will ich aber wissen, wie ich kompliziertere Dateien mit einer etwas anderen Schreibweise (ich bin mir jetzt nicht sicher, habe diese Datei nicht selber geschrieben) in Java-Objekte umwandeln kann:
JSON:
{
      "somedata":{
        "748127387281":{
          "id":1,
          "name":"John",
          "random":74818728382
        },
        "834187381288":{
          "id":2,
          "name":"Peter",
          "random":73482178372
       }
}
Ich möchte gerne wissen, wie ich jeden Child von "somedata" bekommen kann. Das Problem ist hierbei, dass die Nummern wie 748127387281 zufällige bzw. nicht "vorhersehbare" Nummern sind, deshalb kann man beim parsen diese Nummern nicht spezifizieren kann.

Sorry dass meine Frage etwas unverständlich ist, wenn es Fragen gibt, antworte ich natürlich :3

LG
Kenta1561
 
Du kannst einfach eine Map als Typ vonsomedata benutzen. Keys sind Strings (oder auch Integer, wenn die zufälligen Nummern Integer sind), und als Value dein Objekt, was dann entsprechend Id, name und random enthält.
In der map stehen dann mit den entsprechenden Keys die Objekte 😉
 
Du erstellst einfach deine Java-Klassen, hast du doch bei den einfachen sicher auch gemacht?

Du hast deine Klasse, die dein JSON-Objekt darstellt, das enthält die Map, und eine Klasse, die inneren Objekte darstellt, mit ID,Name und Random.
 
Ein kleines Beispiel wie du obigen JSON String parsen könntest (PS: Dein JSON String ist nicht valid, denn ein "}" fehlt).

Java:
import java.util.Map;

import com.google.gson.Gson;

public class Test {
  
  public static void main(String... args) {
    String json = "{\r\n" + 
        "      \"somedata\":{\r\n" + 
        "        \"748127387281\":{\r\n" + 
        "          \"id\":1,\r\n" + 
        "          \"name\":\"John\",\r\n" + 
        "          \"random\":74818728382\r\n" + 
        "        },\r\n" + 
        "        \"834187381288\":{\r\n" + 
        "          \"id\":2,\r\n" + 
        "          \"name\":\"Peter\",\r\n" + 
        "          \"random\":73482178372\r\n" + 
        "       }\r\n" + 
        "   }\r\n" + 
        "}";
    Gson gson = new Gson();
    Parent fromJson = gson.fromJson(json, Parent.class);
    System.out.println(fromJson);
  }
}

class Parent {
  private Map<Long, DataContainer> somedata;
  
  public Parent() {
  }
  
  public Parent(Map<Long, DataContainer> somedata) {
    this.somedata = somedata;
  }
  
  public Map<Long, DataContainer> getSomedata() {
    return somedata;
  }
  
  public void setSomedata(Map<Long, DataContainer> somedata) {
    this.somedata = somedata;
  }
  
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (somedata == null ? 0 : somedata.hashCode());
    return result;
  }
  
  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    Parent other = (Parent) obj;
    if (somedata == null) {
      if (other.somedata != null) {
        return false;
      }
    } else if (!somedata.equals(other.somedata)) {
      return false;
    }
    return true;
  }
  
  @Override
  public String toString() {
    return "Parent [somedata=" + somedata + "]";
  }
  
}

class DataContainer {
  private int id;
  private String name;
  private long random;
  
  public DataContainer() {
  }
  
  public DataContainer(int id, String name, long random) {
    this.id = id;
    this.name = name;
    this.random = random;
  }
  
  public int getId() {
    return id;
  }
  
  public void setId(int id) {
    this.id = id;
  }
  
  public String getName() {
    return name;
  }
  
  public void setName(String name) {
    this.name = name;
  }
  
  public long getRandom() {
    return random;
  }
  
  public void setRandom(long random) {
    this.random = random;
  }
  
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    result = prime * result + (name == null ? 0 : name.hashCode());
    result = prime * result + (int) (random ^ random >>> 32);
    return result;
  }
  
  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    DataContainer other = (DataContainer) obj;
    if (id != other.id) {
      return false;
    }
    if (name == null) {
      if (other.name != null) {
        return false;
      }
    } else if (!name.equals(other.name)) {
      return false;
    }
    if (random != other.random) {
      return false;
    }
    return true;
  }
  
  @Override
  public String toString() {
    return "DataContainer [id=" + id + ", name=" + name + ", random=" + random + "]";
  }
}
 
@Flown
Danke für deine Antwort 😀 Ich habe deine Antwort nicht gesehen und habe in der Zwischenzeit selber nochmal rumprobiert und habe es selber irgendwie geschafft:
Java:
package main.java;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        try{
            BufferedReader br = new BufferedReader(new FileReader("src/main/java/test.json"));
            JsonParser parser = new JsonParser();
            JsonElement parsedJson = parser.parse(br);
            JsonElement somedataElement  = parsedJson.getAsJsonObject().get("somedata");
            JsonObject jsonObject = somedataElement.getAsJsonObject();
            Set<Map.Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
            for(Map.Entry<String, JsonElement> entry : entrySet) {
                JsonElement loopElement = entry.getValue();
                JsonObject loopObject = loopElement.getAsJsonObject();
                System.out.println(loopObject.get("name").toString().replaceAll("\"", "")); //hier replaceAll von '"' weil die Ausgabe bei Strings "" enthält
            }
        } catch(FileNotFoundException fnfException) {
            System.out.println("File Not Found");
        }
    }

}

Trotzdem vielen Dank 😀

LG
Kenta1561
 

Zurück
Oben