All Downloads are FREE. Search and download functionalities are using the official Maven repository.

apoc.export.json.JsonFormatSerializer Maven / Gradle / Ivy

package apoc.export.json;

import apoc.export.util.ExportConfig;
import com.fasterxml.jackson.core.JsonGenerator;
import org.neo4j.graphdb.Label;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import static apoc.export.util.FormatUtils.getLabelsSorted;

public enum JsonFormatSerializer {

    DEFAULT() {

        @Override
        public void writeNode(JsonGenerator jsonGenerator, Node node, ExportConfig config) throws IOException {
            jsonGenerator.writeStartObject();
            jsonGenerator.writeStringField("type", "node");
            writeNodeDetails(jsonGenerator, node, true);
            jsonGenerator.writeEndObject();
        }

        @Override
        public void writeRelationship(JsonGenerator jsonGenerator, Relationship rel, ExportConfig config) throws IOException {
            Node startNode = rel.getStartNode();
            Node endNode = rel.getEndNode();
            jsonGenerator.writeStartObject();
            jsonGenerator.writeStringField("id", String.valueOf(rel.getId()));
            jsonGenerator.writeStringField("type", "relationship");
            jsonGenerator.writeStringField("label", rel.getType().toString());
            serializeProperties(jsonGenerator, rel.getAllProperties());
            writeRelationshipNode(jsonGenerator, "start", startNode, config);
            writeRelationshipNode(jsonGenerator, "end", endNode, config);
            jsonGenerator.writeEndObject();
        }

        @Override
        public void serializeProperties(JsonGenerator jsonGenerator, Map properties) throws IOException {
            if(properties != null && !properties.isEmpty()) {
                jsonGenerator.writeObjectFieldStart("properties");
                for (Map.Entry entry : properties.entrySet()) {
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    serializeProperty(jsonGenerator, key, value, true);
                }
                jsonGenerator.writeEndObject();
            }
        }

        @Override
        public void serializeProperty(JsonGenerator jsonGenerator, String key, Object value, boolean writeKey) throws IOException {
            if (value == null) {
                if (writeKey) {
                    jsonGenerator.writeNullField(key);
                } else {
                    jsonGenerator.writeNull();
                }
            } else {
                if (writeKey) {
                    jsonGenerator.writeObjectField(key, value);
                } else {
                    jsonGenerator.writeObject(value);
                }
            }
        }

        private void writeNodeDetails(JsonGenerator jsonGenerator, Node node, boolean withNodeProperties) throws IOException {
            jsonGenerator.writeStringField("id", String.valueOf(node.getId()));

            if (node.getLabels().iterator().hasNext()) {
                jsonGenerator.writeArrayFieldStart("labels");

                List labels = getLabelsSorted(node);
                for (String label : labels) {
                    jsonGenerator.writeString(label);
                }
                jsonGenerator.writeEndArray();
            }
            if (withNodeProperties) {
                serializeProperties(jsonGenerator, node.getAllProperties());
            }
        }

        private void writeRelationshipNode(JsonGenerator jsonGenerator, String type, Node node, ExportConfig config) throws IOException {
            jsonGenerator.writeObjectFieldStart(type);

            writeNodeDetails(jsonGenerator, node, config.writeNodeProperties());
            jsonGenerator.writeEndObject();
        }
    };

    public abstract void writeNode(JsonGenerator jsonGenerator, Node node, ExportConfig config) throws IOException;

    public abstract void writeRelationship(JsonGenerator jsonGenerator, Relationship relationship, ExportConfig config) throws IOException;

    public abstract void serializeProperties(JsonGenerator jsonGenerator, Map properties) throws IOException;

    public abstract void serializeProperty(JsonGenerator jsonGenerator, String key, Object value, boolean writeKey) throws IOException;

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy