How do I Serialize and Deserialize with Jackson from and to a Jtree? -Java

Viewed 93

I am a beginner in Java programming and I desperatly need help. I have a Programm with a GUI interface where I have to Serialize Jobs and Resources and save them into a Json File. THen when opening the program again I need the saved Items to still be in the Gui and I am at a poit where I just want to give up so any help would greatly be appreciated. I will only post the Job Serialation because the Resource one will be just the same. I am using a jackson seriaizer and deserializer.

This is my Job Class

package de.hft_stuttgart.ip1.common;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

import java.beans.ConstructorProperties;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id", scope=Job.class)
public class Job implements Serializable {
    @JsonProperty(index=0)
    private long id;
    @JsonProperty(index=1)
    private String name;
    @JsonProperty(index=2)
    private List<ResourceConsumption> consumingResources;
    @JsonProperty(index=3)
    private List<Integer> dependencies;

    @ConstructorProperties({"id", "name"})
    public Job(long id, String name) {
        this.id = id;
        this.name = name;

        consumingResources = new ArrayList<>();
        dependencies = new ArrayList<>();

        if ( id == -1 ) {
            id = System.currentTimeMillis();
        }
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public List<ResourceConsumption> getConsumptions() {
        return consumingResources;
    }

    public List<Integer> getDependencies() {
        return dependencies;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(int id) { this.id = id;
    }

    public void setConsumptions(List<ResourceConsumption> consumptions) {
        this.consumingResources = consumptions;
    }

    public void setDependencies(List<Integer> dependencies) {
        this.dependencies = dependencies;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Job job = (Job) o;
        return id == job.id && name.equals(job.name) && consumingResources.equals(job.consumingResources) && dependencies.equals(job.dependencies);
    }

    @Override
    public String toString() {
        return name + " / " + consumingResources + " / " + dependencies;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, consumingResources, dependencies);
    }


}

This is my Job Serializer

package de.hft_stuttgart.ip1.common;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class JobSerializer extends StdSerializer<Job> {
    public JobSerializer() {
        this(null);
    }

    public JobSerializer(Class<Job> t) {
        super(t);
    }

    @Override
    public void serialize(Job job, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {

        jsonGenerator.writeNumber(job.getId());
        jsonGenerator.writeString(job.getName());
        jsonGenerator.writeObject(job.getConsumptions());
        jsonGenerator.writeObject(job.getDependencies());

    }
}

This is my Deserializer

package de.hft_stuttgart.ip1.common;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;

import java.io.IOException;
import java.nio.file.Paths;
import java.util.List;

public class JobDeserializer extends StdDeserializer{

    public JobDeserializer() {
        this(null);
    }

    public JobDeserializer(Class<Job> t) {
        super(t);
    }

    @Override
    public Job deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {

        Job job = new Job(1234,"Herbert");

        JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);
        JsonNode customIdNode = jsonNode.get("id");
        JsonNode customNameNode = jsonNode.get("name");
//            JsonNode customDependenciesNode = jsonNode.get("dependencies");
//            JsonNode customConsumptionNode = jsonNode.get("consumptions");


        int id = customIdNode.asInt();
        String name = customNameNode.asText();
//            Object dependencies = customDependenciesNode.asText();
//            Object consumptions = customConsumptionNode.asText();

        job.setId(id);
        job.setName(name);
//            job.setConsumptions((List<ResourceConsumption>) consumptions);
//            job.setDependencies((List<Integer>) dependencies);

        return job;
    }
}

This is my Save Action Class where I save my Jtree nodes into a json file

package de.hft_stuttgart.ip1.client.actions;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import de.hft_stuttgart.ip1.common.Job;
import de.hft_stuttgart.ip1.common.JobSerializer;
import de.hft_stuttgart.ip1.common.Resource;
import de.hft_stuttgart.ip1.common.ResourceSerializer;
import de.hft_stuttgart.ip1.gui.MainFrame;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.InputEvent;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

public class SaveAction extends AbstractAction{
    private MainFrame mainFrame;
    private JTree tree;

    public SaveAction(MainFrame mainFrame, JTree tree) {
        this.mainFrame = mainFrame;
        this.tree = tree;
        putValue(Action.NAME, "Speichern");
    }

    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
        DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();

        DefaultMutableTreeNode resourceParent = (DefaultMutableTreeNode) root.getChildAt(0);
        int resourceChildsNum = resourceParent.getChildCount();
        ArrayList<Object> resourceChildsArr = new ArrayList<>();
        for (int i = 0; i < resourceChildsNum; i++) {
            DefaultMutableTreeNode iChild = (DefaultMutableTreeNode) resourceParent.getChildAt(i);
            if (!iChild.getUserObject().equals("<Neue Ressource>")) {
                resourceChildsArr.add((Resource) iChild.getUserObject());
            }
        }

        DefaultMutableTreeNode jobParent = (DefaultMutableTreeNode) root.getChildAt(1);
        int jobChildsNum = jobParent.getChildCount();
        ArrayList<Object> jobChildsArr = new ArrayList<>();
        for (int i = 0; i < jobChildsNum; i++) {
            DefaultMutableTreeNode iChild = (DefaultMutableTreeNode) jobParent.getChildAt(i);
            if (!iChild.getUserObject().equals("<Neuer Job>")) {
                jobChildsArr.add((Job) iChild.getUserObject());
            }
        }

        ArrayList<ArrayList<Object>> serializeArr = new ArrayList<>();
        serializeArr.add(resourceChildsArr);
        serializeArr.add(jobChildsArr);

        File file = new File("SoSe22/A_091_ProjectPlanner/src/main/java/saves/jsonFile.json");
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(Job.class, new JobSerializer());
        module.addSerializer(Resource.class, new ResourceSerializer());
        mapper.registerModule(module);
        try {
            mapper.writeValue(file, serializeArr);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.exit(0);
    }
}

And how to get the json file and map it onto the Jtree I have no Idea what to do or what to google.

0 Answers
Related