gson mit einer Hashmap

Fohnbit

Top Contributor
Hallo,

Ich speichere eine Instanz einer Klasse in ein json file und lade dieses bei erneuten Start wieder.

Aber ich erhalte immer den Fehler:
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 3 column 6 path $.loadingBays.

Der Anfang der json Datei:
JSON:
{
  "loadingBays": {
    "2021-02-24": {
      "bay": [
        {
          "finishedTransportOrders": [],
          "waitingTransportOrders": [
              .......

Ich denk es die HashMap .. Anleitungen habe ich nur gefunden, wenn ich diese direkt serialisieren würde.

[CODE lang="java" title="Aufruf des ladens"] LocalDate date = LocalDate.now();
String path = "loadingSlots" + "[" + date.getMonthValue() + "-" + date.getYear() + "]";
loadingSlotMain = (LoadingSlotMain) readJson(loadingSlotMain, path);[/CODE]

[CODE lang="java" title="Json laden"] private Object readJson(Object o, String name) {
File file = new File(SYSTEMPATH + "\\" + name + ".json");
Reader reader = null;
Object obj = null;
try {
if (file.exists()) {
reader = new FileReader(file);
if (name.startsWith("loadingSlots")) {
// Type typeOfHashMap = new TypeToken<HashMap<LocalDate, LoadingSlots>>() {
// }.getType();
obj = gson.fromJson(reader, o.getClass());
} else {
obj = gson.fromJson(reader, o.getClass());
}
reader.close();
} else {
logger.error(name + " not found");
}
} catch (FileNotFoundException e) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
logger.error("Error " + e.getMessage() + " in 'readJson'");
} catch (IOException e) {
e.printStackTrace();
}
return obj;[/CODE]
Der Fehler kommt bei Zeile 11: obj = gson.fromJson(reader, o.getClass());

[CODE lang="java" title="class LoadingSlotMain"]public class LoadingSlotMain {

private transient Logger logger = (Logger) LoggerFactory.getLogger(this.getClass());
public static final long NEXT_TRUCK_DELAY = 30000; // ms
private static int MAX_SLOTS;
private static int PAGER_AMOUNT;
public transient Date[] lastTruckRequestBay;

public HashMap<LocalDate, LoadingSlots> loadingBays = new HashMap<LocalDate, LoadingSlots>();

public transient Pagers pagers = new Pagers(PAGER_AMOUNT);

...[/CODE]
 
GSON hat keinen Support für LocalDate, daher kann es nicht deserialisiert werden. Du müsstest selber einen JsonDeserializer<LocalDate> implementieren (und am besten auch einen Serializer), dann klappt es.
 
Guten Morgen mrBrown,

ahh, JsonDeserializer<LocalDate> hatte ich vergessen.
hatte nur JsonSerializer<LocalDate>:
Java:
private Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX").enableComplexMapKeySerialization()
            .registerTypeAdapter(LocalDate.class, new LocalDateAdapter()).setPrettyPrinting().create();

class LocalDateAdapter implements JsonDeserializer<LocalDate>, JsonSerializer<LocalDate> {

    public JsonElement serialize(LocalDate date, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(date.format(DateTimeFormatter.ISO_LOCAL_DATE));
    }

    @Override
    public LocalDate deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext)
            throws JsonParseException {
        return LocalDate.parse(json.getAsJsonPrimitive().getAsString());
    }
 

Zurück
Oben