From 6d9a7ffb1b2ac4d41db30e588eb534ed67bfba70 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Wed, 3 Dec 2014 18:28:00 +0100 Subject: [PATCH] refine json stuff to easily add additional json objects --- .../jsprit/core/problem/io/JsonConstants.java | 6 ++ .../jsprit/core/problem/io/VrpJsonReader.java | 20 ++--- .../jsprit/core/problem/io/VrpJsonWriter.java | 77 +++++++++++++------ 3 files changed, 66 insertions(+), 37 deletions(-) diff --git a/jsprit-core/src/main/java/jsprit/core/problem/io/JsonConstants.java b/jsprit-core/src/main/java/jsprit/core/problem/io/JsonConstants.java index 59af2cb9..9b312297 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/io/JsonConstants.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/io/JsonConstants.java @@ -22,6 +22,10 @@ package jsprit.core.problem.io; */ public class JsonConstants { + public static final String PROBLEM = "vrp"; + + public static final String SOLUTION = "solution"; + public static final String SERVICES = "services"; public static final String FLEET = "fleet_size"; @@ -164,4 +168,6 @@ public class JsonConstants { public static final String TIME = "time_dependent_costs"; } } + + } diff --git a/jsprit-core/src/main/java/jsprit/core/problem/io/VrpJsonReader.java b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpJsonReader.java index de7f0f42..39457f8a 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/io/VrpJsonReader.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpJsonReader.java @@ -32,7 +32,6 @@ import jsprit.core.problem.vehicle.VehicleType; import jsprit.core.problem.vehicle.VehicleTypeImpl; import jsprit.core.util.Coordinate; -import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; @@ -70,18 +69,18 @@ public class VrpJsonReader { parse(root); } - private void parse(JsonNode root) { - setFleetSize(root); - parse_and_map_vehicle_types(root); - parse_vehicles(root); - parse_services(root); + public void parse(JsonNode problemRoot) { + setFleetSize(problemRoot); + parse_and_map_vehicle_types(problemRoot); + parse_vehicles(problemRoot); + parse_services(problemRoot); } private JsonNode buildTree_and_getRoot_fromContent(String jsonContent){ JsonNode node = null; try { ObjectMapper objectMapper = new ObjectMapper(); - node = objectMapper.readTree(jsonContent); + node = objectMapper.readTree(jsonContent).path(JsonConstants.PROBLEM); } catch (IOException e) { e.printStackTrace(); System.exit(1); @@ -93,12 +92,7 @@ public class VrpJsonReader { JsonNode node = null; try { ObjectMapper objectMapper = new ObjectMapper(); - String jsonContent = ""; - BufferedReader reader = new BufferedReader(new FileReader(jsonFile)); - String line; - while((line = reader.readLine()) != null) jsonContent += line; - reader.close(); - node = objectMapper.readTree(jsonContent); + node = objectMapper.readTree(new FileReader(jsonFile)).path(JsonConstants.PROBLEM); } catch (IOException e) { e.printStackTrace(); System.exit(1); diff --git a/jsprit-core/src/main/java/jsprit/core/problem/io/VrpJsonWriter.java b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpJsonWriter.java index de9768e9..f7fda2d8 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/io/VrpJsonWriter.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpJsonWriter.java @@ -39,10 +39,7 @@ import jsprit.core.problem.vehicle.VehicleTypeImpl; import jsprit.core.util.Coordinate; import jsprit.core.util.Solutions; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.StringWriter; +import java.io.*; import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -82,11 +79,8 @@ public class VrpJsonWriter { return stringWriter.toString(); } - - - public void write(File jsonFile){ + public void addTo(JsonGenerator jsonGenerator){ try { - JsonGenerator jsonGenerator = new JsonFactory().createGenerator(new FileOutputStream(jsonFile), JsonEncoding.UTF8); if(solution == null) writeProblem(jsonGenerator); else writeSolution(jsonGenerator); } catch (IOException e) { @@ -95,17 +89,41 @@ public class VrpJsonWriter { } } - private void writeSolution(JsonGenerator jsonGenerator) throws IOException { - jsonGenerator.setPrettyPrinter(new DefaultPrettyPrinter()); - jsonGenerator.writeStartObject(); - writeSolution_(jsonGenerator); - jsonGenerator.writeEndObject(); - jsonGenerator.flush(); - jsonGenerator.close(); + public void write(Writer writer){ + try { + JsonGenerator jsonGenerator = new JsonFactory().createGenerator(writer); + jsonGenerator.setPrettyPrinter(new DefaultPrettyPrinter()); + jsonGenerator.writeStartObject(); + if(solution == null) writeProblem(jsonGenerator); + else writeSolution(jsonGenerator); + jsonGenerator.writeEndObject(); + jsonGenerator.flush(); + jsonGenerator.close(); + } catch (IOException e) { + e.printStackTrace(); + System.exit(1); + } } - private void writeSolution_(JsonGenerator jsonGenerator) { + public void write(File jsonFile){ try { + JsonGenerator jsonGenerator = new JsonFactory().createGenerator(new FileOutputStream(jsonFile), JsonEncoding.UTF8); + jsonGenerator.setPrettyPrinter(new DefaultPrettyPrinter()); + jsonGenerator.writeStartObject(); + if(solution == null) writeProblem(jsonGenerator); + else writeSolution(jsonGenerator); + jsonGenerator.writeEndObject(); + jsonGenerator.flush(); + jsonGenerator.close(); + } catch (IOException e) { + e.printStackTrace(); + System.exit(1); + } + } + + private void writeSolution(JsonGenerator jsonGenerator) { + try { + jsonGenerator.writeObjectFieldStart(JsonConstants.SOLUTION); jsonGenerator.writeNumberField(JsonConstants.Solution.COSTS,solution.getCost()); jsonGenerator.writeNumberField(JsonConstants.Solution.FIXED_COSTS,solutionAnalyzer.getFixedCosts()); jsonGenerator.writeNumberField(JsonConstants.Solution.VARIABLE_COSTS, solutionAnalyzer.getVariableTransportCosts()); @@ -142,6 +160,7 @@ public class VrpJsonWriter { jsonGenerator.writeString(j.getId()); } jsonGenerator.writeEndArray(); + jsonGenerator.writeEndObject(); } catch (IOException e) { e.printStackTrace(); @@ -150,15 +169,12 @@ public class VrpJsonWriter { } private void writeProblem(JsonGenerator jsonGenerator) throws IOException { - jsonGenerator.setPrettyPrinter(new DefaultPrettyPrinter()); - jsonGenerator.writeStartObject(); - jsonGenerator.writeStringField(JsonConstants.FLEET,vrp.getFleetSize().toString()); + jsonGenerator.writeObjectFieldStart(JsonConstants.PROBLEM); + jsonGenerator.writeStringField(JsonConstants.FLEET, vrp.getFleetSize().toString()); writeVehicles(jsonGenerator); writeVehicleTypes(jsonGenerator); writeServices(jsonGenerator); jsonGenerator.writeEndObject(); - jsonGenerator.flush(); - jsonGenerator.close(); } private void writeVehicleTypes(JsonGenerator jsonGenerator) { @@ -275,7 +291,7 @@ public class VrpJsonWriter { } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { Service service = Service.Builder.newInstance("s1").setLocationId("s1_loc").setCoord(Coordinate.newInstance(40, 10)) .addSizeDimension(0, 20).addSizeDimension(1, 40) .setServiceTime(1.) @@ -311,19 +327,32 @@ public class VrpJsonWriter { // System.out.println(new VrpJsonWriter(vrp).toString()); VehicleRoutingProblem.Builder vrpBuilder_ = VehicleRoutingProblem.Builder.newInstance(); - new VrpJsonReader(vrpBuilder_).read("output/vpr.json"); + new VrpJsonReader(vrpBuilder_).read(new File("output/vrp.json")); VehicleRoutingProblem vrp_ = vrpBuilder_.build(); VehicleRoutingAlgorithm vra = new GreedySchrimpfFactory().createAlgorithm(vrp_); VehicleRoutingProblemSolution solutions = Solutions.bestOf(vra.searchSolutions()); + FileWriter fileWriter = new FileWriter(new File("output/vrp-solution.json")); + JsonGenerator jsonGenerator = new JsonFactory().createGenerator(fileWriter); + jsonGenerator.setPrettyPrinter(new DefaultPrettyPrinter()); + jsonGenerator.writeStartObject(); + jsonGenerator.writeObjectFieldStart("meta-info"); + jsonGenerator.writeStringField("distance-unit", "m"); + jsonGenerator.writeStringField("time-unit","sec"); + jsonGenerator.writeEndObject(); new VrpJsonWriter(vrp,solutions,new SolutionAnalyser.DistanceCalculator() { @Override public double getDistance(String fromLocationId, String toLocationId) { return vrp.getTransportCosts().getTransportCost(fromLocationId,toLocationId,0.,null,null); } - }).write(new File("output/vrp-solution.json")); + }).addTo(jsonGenerator); + jsonGenerator.writeEndObject(); + jsonGenerator.flush(); + jsonGenerator.close(); + fileWriter.close(); +// .write(new File("output/vrp-solution.json")); } }