From 6af6bc5472a8c024d49dbd5c8adfccf85fffbbab Mon Sep 17 00:00:00 2001
From: Tim Quatmann <tim.quatmann@cs.rwth-aachen.de>
Date: Fri, 13 Mar 2020 16:32:09 +0100
Subject: [PATCH] Replaced remaining uses of modernjson::json with the new
 storm::json<..>

---
 src/storm-dft/parser/DFTJsonParser.cpp        |  18 +-
 src/storm-dft/parser/DFTJsonParser.h          |  12 +-
 src/storm-dft/storage/dft/DftJsonExporter.cpp |  14 +-
 src/storm-dft/storage/dft/DftJsonExporter.h   |  14 +-
 .../storage/gspn/GspnJsonExporter.cpp         |  52 ++--
 .../storage/gspn/GspnJsonExporter.h           |  17 +-
 src/storm/storage/Qvbs.cpp                    |   9 +-
 src/storm/storage/Qvbs.h                      |   9 +-
 src/storm/storage/jani/JSONExporter.cpp       | 222 +++++++++---------
 src/storm/storage/jani/JSONExporter.h         |  27 +--
 10 files changed, 189 insertions(+), 205 deletions(-)

diff --git a/src/storm-dft/parser/DFTJsonParser.cpp b/src/storm-dft/parser/DFTJsonParser.cpp
index b099aeca9..0cda7ff08 100644
--- a/src/storm-dft/parser/DFTJsonParser.cpp
+++ b/src/storm-dft/parser/DFTJsonParser.cpp
@@ -21,7 +21,7 @@ namespace storm {
             STORM_LOG_DEBUG("Parsing from JSON file");
             std::ifstream file;
             storm::utility::openFile(filename, file);
-            json jsonInput;
+            Json jsonInput;
             jsonInput << file;
             storm::utility::closeFile(file);
             return parseJson(jsonInput);
@@ -30,19 +30,19 @@ namespace storm {
         template<typename ValueType>
         storm::storage::DFT<ValueType> DFTJsonParser<ValueType>::parseJsonFromString(std::string const& jsonString) {
             STORM_LOG_DEBUG("Parsing from JSON string");
-            json jsonInput = json::parse(jsonString);
+            Json jsonInput = Json::parse(jsonString);
             return parseJson(jsonInput);
         }
 
         template<typename ValueType>
-        storm::storage::DFT<ValueType> DFTJsonParser<ValueType>::parseJson(json const& jsonInput) {
+        storm::storage::DFT<ValueType> DFTJsonParser<ValueType>::parseJson(Json const& jsonInput) {
             // Init DFT builder and value parser
             storm::builder::DFTBuilder<ValueType> builder;
             ValueParser<ValueType> valueParser;
 
             // Try to parse parameters
             if (jsonInput.find("parameters") != jsonInput.end()) {
-                json parameters = jsonInput.at("parameters");
+                Json parameters = jsonInput.at("parameters");
                 STORM_LOG_THROW(parameters.empty() || (std::is_same<ValueType, storm::RationalFunction>::value), storm::exceptions::NotSupportedException,
                                 "Parameters only allowed when using rational functions.");
                 for (auto it = parameters.begin(); it != parameters.end(); ++it) {
@@ -52,12 +52,12 @@ namespace storm {
                 }
             }
 
-            json nodes = jsonInput.at("nodes");
+            Json nodes = jsonInput.at("nodes");
             // Start by building mapping from ids to their unique names
             std::map<std::string, std::string> nameMapping;
             std::set<std::string> names;
             for (auto& element : nodes) {
-                json data = element.at("data");
+                Json data = element.at("data");
                 std::string id = data.at("id");
                 std::string uniqueName = generateUniqueName(data.at("name"));
                 STORM_LOG_THROW(names.find(uniqueName) == names.end(), storm::exceptions::WrongFormatException, "Element '" << uniqueName << "' was already declared.");
@@ -69,7 +69,7 @@ namespace storm {
             for (auto& element : nodes) {
                 STORM_LOG_TRACE("Parsing: " << element);
                 bool success = true;
-                json data = element.at("data");
+                Json data = element.at("data");
                 std::string name = generateUniqueName(data.at("name"));
                 std::vector<std::string> childNames;
                 if (data.count("children") > 0) {
@@ -137,7 +137,7 @@ namespace storm {
                     // TODO: do splitting later in rewriting step
                     if (type != "fdep" && type != "pdep") {
                         // Set layout positions
-                        json position = element.at("position");
+                        Json position = element.at("position");
                         double x = position.at("x");
                         double y = position.at("y");
                         builder.addLayoutInfo(name, x / 7, y / 7);
@@ -171,7 +171,7 @@ namespace storm {
         }
 
         template<typename ValueType>
-        std::string DFTJsonParser<ValueType>::parseJsonNumber(json number) {
+        std::string DFTJsonParser<ValueType>::parseJsonNumber(Json number) {
             if (number.is_string()) {
                 return number.get<std::string>();
             } else {
diff --git a/src/storm-dft/parser/DFTJsonParser.h b/src/storm-dft/parser/DFTJsonParser.h
index c092d47eb..8bcd4605a 100644
--- a/src/storm-dft/parser/DFTJsonParser.h
+++ b/src/storm-dft/parser/DFTJsonParser.h
@@ -4,18 +4,14 @@
 
 #include "storm-dft/storage/dft/DFT.h"
 #include "storm-dft/builder/DFTBuilder.h"
-
-// JSON parser
-#include "json.hpp"
-
-using json = nlohmann::json;
-
+#include "storm/adapters/JsonAdapter.h"
 namespace storm {
     namespace parser {
 
         template<typename ValueType>
         class DFTJsonParser {
 
+            typedef typename storm::json<double> Json;
         public:
 
             static storm::storage::DFT<ValueType> parseJsonFromString(std::string const& jsonString);
@@ -23,11 +19,11 @@ namespace storm {
             static storm::storage::DFT<ValueType> parseJsonFromFile(std::string const& filename);
 
         private:
-            static storm::storage::DFT<ValueType> parseJson(json const& jsonInput);
+            static storm::storage::DFT<ValueType> parseJson(Json const& jsonInput);
 
             static std::string generateUniqueName(std::string const& name);
 
-            static std::string parseJsonNumber(json number);
+            static std::string parseJsonNumber(Json number);
         };
     }
 }
diff --git a/src/storm-dft/storage/dft/DftJsonExporter.cpp b/src/storm-dft/storage/dft/DftJsonExporter.cpp
index 9ff66615e..506536ee5 100644
--- a/src/storm-dft/storage/dft/DftJsonExporter.cpp
+++ b/src/storm-dft/storage/dft/DftJsonExporter.cpp
@@ -24,23 +24,23 @@ namespace storm {
         }
 
         template<typename ValueType>
-        modernjson::json DftJsonExporter<ValueType>::translate(storm::storage::DFT<ValueType> const& dft) {
+        typename DftJsonExporter<ValueType>::Json DftJsonExporter<ValueType>::translate(storm::storage::DFT<ValueType> const& dft) {
             // Nodes
-            modernjson::json jsonNodes;
+            Json jsonNodes;
             for (size_t i = 0; i < dft.nrElements(); ++i) {
-                modernjson::json jsonNode = translateNode(dft.getElement(i));
+                Json jsonNode = translateNode(dft.getElement(i));
                 jsonNodes.push_back(jsonNode);
             }
 
-            modernjson::json jsonDft;
+            Json jsonDft;
             jsonDft["toplevel"] = std::to_string(dft.getTopLevelIndex());
             jsonDft["nodes"] = jsonNodes;
             return jsonDft;
         }
 
         template<typename ValueType>
-        modernjson::json DftJsonExporter<ValueType>::translateNode(DFTElementCPointer const& element) {
-            modernjson::json nodeData;
+        typename DftJsonExporter<ValueType>::Json DftJsonExporter<ValueType>::translateNode(DFTElementCPointer const& element) {
+            Json nodeData;
             nodeData["id"] = std::to_string(element->id());
             nodeData["name"] = element->name();
             std::string type = storm::storage::toString(element->type());
@@ -117,7 +117,7 @@ namespace storm {
                 STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Element of type '" << element->type() << "' is not supported.");
             }
 
-            modernjson::json jsonNode;
+            Json jsonNode;
             jsonNode["data"] = nodeData;
             jsonNode["group"] = "nodes";
             jsonNode["classes"] = type;
diff --git a/src/storm-dft/storage/dft/DftJsonExporter.h b/src/storm-dft/storage/dft/DftJsonExporter.h
index 646821bb6..542857879 100644
--- a/src/storm-dft/storage/dft/DftJsonExporter.h
+++ b/src/storm-dft/storage/dft/DftJsonExporter.h
@@ -3,12 +3,7 @@
 #include "storm/utility/macros.h"
 
 #include "storm-dft/storage/dft/DFT.h"
-
-// JSON parser
-#include "json.hpp"
-namespace modernjson {
-    using json = nlohmann::basic_json<std::map, std::vector, std::string, bool, int64_t, uint64_t, double, std::allocator>;
-}
+#include "storm/adapters/JsonAdapter.h"
 
 namespace storm {
     namespace storage {
@@ -18,7 +13,8 @@ namespace storm {
          */
         template<typename ValueType>
         class DftJsonExporter {
-
+            typedef typename storm::json<double> Json;
+            
             using DFTElementPointer = std::shared_ptr<DFTElement<ValueType>>;
             using DFTElementCPointer = std::shared_ptr<DFTElement<ValueType> const>;
             using DFTGatePointer = std::shared_ptr<DFTGate<ValueType>>;
@@ -31,9 +27,9 @@ namespace storm {
 
         private:
 
-            static modernjson::json translate(storm::storage::DFT<ValueType> const& dft);
+            static Json translate(storm::storage::DFT<ValueType> const& dft);
 
-            static modernjson::json translateNode(DFTElementCPointer const& element);
+            static Json translateNode(DFTElementCPointer const& element);
 
         };
     }
diff --git a/src/storm-gspn/storage/gspn/GspnJsonExporter.cpp b/src/storm-gspn/storage/gspn/GspnJsonExporter.cpp
index f4e910b81..0c2df7532 100644
--- a/src/storm-gspn/storage/gspn/GspnJsonExporter.cpp
+++ b/src/storm-gspn/storage/gspn/GspnJsonExporter.cpp
@@ -17,8 +17,8 @@ namespace storm {
             os << translate(gspn).dump(4) << std::endl;
         }
 
-        modernjson::json GspnJsonExporter::translate(storm::gspn::GSPN const& gspn) {
-            modernjson::json jsonGspn;
+        typename GspnJsonExporter::Json GspnJsonExporter::translate(storm::gspn::GSPN const& gspn) {
+            Json jsonGspn;
 
             // Layouts
             std::map<uint64_t, LayoutInfo> placeLayout = gspn.getPlaceLayoutInfos();
@@ -35,7 +35,7 @@ namespace storm {
                     y = placeLayout.at(place.getID()).y;
                 }
                 tmpX += 3;
-                modernjson::json jsonPlace = translatePlace(place, x, y);
+                Json jsonPlace = translatePlace(place, x, y);
                 jsonGspn.push_back(jsonPlace);
             }
 
@@ -48,7 +48,7 @@ namespace storm {
                     y = transitionLayout.at(transition.getID()).y;
                 }
                 tmpX += 3;
-                modernjson::json jsonImmediateTransition = translateImmediateTransition(transition, x, y);
+                Json jsonImmediateTransition = translateImmediateTransition(transition, x, y);
                 jsonGspn.push_back(jsonImmediateTransition);
             }
 
@@ -61,7 +61,7 @@ namespace storm {
                     y = transitionLayout.at(transition.getID()).y;
                 }
                 tmpX += 3;
-                modernjson::json jsonTimedTransition = translateTimedTransition(transition, x, y);
+                Json jsonTimedTransition = translateTimedTransition(transition, x, y);
                 jsonGspn.push_back(jsonTimedTransition);
             }
 
@@ -72,21 +72,21 @@ namespace storm {
                 // Export input arcs
                 for (auto const& entry : transition.getInputPlaces()) {
                     storm::gspn::Place place = places.at(entry.first);
-                    modernjson::json jsonInputArc = translateArc(transition, place, entry.second, true, ArcType::INPUT);
+                    Json jsonInputArc = translateArc(transition, place, entry.second, true, ArcType::INPUT);
                     jsonGspn.push_back(jsonInputArc);
                 }
 
                 // Export inhibitor arcs
                 for (auto const& entry : transition.getInhibitionPlaces()) {
                     storm::gspn::Place place = places.at(entry.first);
-                    modernjson::json jsonInputArc = translateArc(transition, place, entry.second, true, ArcType::INHIBITOR);
+                    Json jsonInputArc = translateArc(transition, place, entry.second, true, ArcType::INHIBITOR);
                     jsonGspn.push_back(jsonInputArc);
                 }
 
                 // Export output arcs
                 for (auto const& entry : transition.getOutputPlaces()) {
                     storm::gspn::Place place = places.at(entry.first);
-                    modernjson::json jsonInputArc = translateArc(transition, place, entry.second, true, ArcType::OUTPUT);
+                    Json jsonInputArc = translateArc(transition, place, entry.second, true, ArcType::OUTPUT);
                     jsonGspn.push_back(jsonInputArc);
                 }
             }
@@ -95,21 +95,21 @@ namespace storm {
                 // Export input arcs
                 for (auto const& entry : transition.getInputPlaces()) {
                     storm::gspn::Place place = places.at(entry.first);
-                    modernjson::json jsonInputArc = translateArc(transition, place, entry.second, false, ArcType::INPUT);
+                    Json jsonInputArc = translateArc(transition, place, entry.second, false, ArcType::INPUT);
                     jsonGspn.push_back(jsonInputArc);
                 }
 
                 // Export inhibitor arcs
                 for (auto const& entry : transition.getInhibitionPlaces()) {
                     storm::gspn::Place place = places.at(entry.first);
-                    modernjson::json jsonInputArc = translateArc(transition, place, entry.second, false, ArcType::INHIBITOR);
+                    Json jsonInputArc = translateArc(transition, place, entry.second, false, ArcType::INHIBITOR);
                     jsonGspn.push_back(jsonInputArc);
                 }
 
                 // Export output arcs
                 for (auto const& entry : transition.getOutputPlaces()) {
                     storm::gspn::Place place = places.at(entry.first);
-                    modernjson::json jsonInputArc = translateArc(transition, place, entry.second, false, ArcType::OUTPUT);
+                    Json jsonInputArc = translateArc(transition, place, entry.second, false, ArcType::OUTPUT);
                     jsonGspn.push_back(jsonInputArc);
                 }
             }
@@ -117,17 +117,17 @@ namespace storm {
         }
 
 
-        modernjson::json GspnJsonExporter::translatePlace(storm::gspn::Place const& place, double x, double y) {
-            modernjson::json data;
+        typename GspnJsonExporter::Json GspnJsonExporter::translatePlace(storm::gspn::Place const& place, double x, double y) {
+            Json data;
             data["id"] = toJsonString(place);
             data["name"] = place.getName();
             data["marking"] = place.getNumberOfInitialTokens();
 
-            modernjson::json position;
+            Json position;
             position["x"] = x * scaleFactor;
             position["y"] = y * scaleFactor;
 
-            modernjson::json jsonPlace;
+            Json jsonPlace;
             jsonPlace["data"] = data;
             jsonPlace["position"] = position;
             jsonPlace["group"] = "nodes";
@@ -135,18 +135,18 @@ namespace storm {
             return jsonPlace;
         }
 
-        modernjson::json GspnJsonExporter::translateImmediateTransition(storm::gspn::ImmediateTransition<double> const& transition, double x, double y) {
-            modernjson::json data;
+        typename GspnJsonExporter::Json GspnJsonExporter::translateImmediateTransition(storm::gspn::ImmediateTransition<double> const& transition, double x, double y) {
+            Json data;
             data["id"] = toJsonString(transition, true);
             data["name"] = transition.getName();
             data["priority"] = transition.getPriority();
             data["weight"] = transition.getWeight();
 
-            modernjson::json position;
+            Json position;
             position["x"] = x * scaleFactor;
             position["y"] = y * scaleFactor;
 
-            modernjson::json jsonTrans;
+            Json jsonTrans;
             jsonTrans["data"] = data;
             jsonTrans["position"] = position;
             jsonTrans["group"] = "nodes";
@@ -154,8 +154,8 @@ namespace storm {
             return jsonTrans;
         }
 
-         modernjson::json GspnJsonExporter::translateTimedTransition(storm::gspn::TimedTransition<double> const& transition, double x, double y) {
-             modernjson::json data;
+         typename GspnJsonExporter::Json GspnJsonExporter::translateTimedTransition(storm::gspn::TimedTransition<double> const& transition, double x, double y) {
+             Json data;
              data["id"] = toJsonString(transition, false);
              data["name"] = transition.getName();
              data["rate"] = transition.getRate();
@@ -170,11 +170,11 @@ namespace storm {
                  }
              }
              
-             modernjson::json position;
+             Json position;
              position["x"] = x * scaleFactor;
              position["y"] = y * scaleFactor;
 
-             modernjson::json jsonTrans;
+             Json jsonTrans;
              jsonTrans["data"] = data;
              jsonTrans["position"] = position;
              jsonTrans["group"] = "nodes";
@@ -182,14 +182,14 @@ namespace storm {
              return jsonTrans;
          }
 
-        modernjson::json GspnJsonExporter::translateArc(storm::gspn::Transition const& transition, storm::gspn::Place const& place, uint64_t multiplicity, bool immediate, ArcType arctype) {
-            modernjson::json data;
+        typename GspnJsonExporter::Json GspnJsonExporter::translateArc(storm::gspn::Transition const& transition, storm::gspn::Place const& place, uint64_t multiplicity, bool immediate, ArcType arctype) {
+            Json data;
             data["id"] = toJsonString(transition, place, arctype);
             data["source"] = toJsonString(place);
             data["target"] = toJsonString(transition, immediate);
             data["mult"] = multiplicity;
 
-            modernjson::json jsonArc;
+            Json jsonArc;
             jsonArc["data"] = data;
             //jsonTrans["group"] = "nodes";
             switch (arctype) {
diff --git a/src/storm-gspn/storage/gspn/GspnJsonExporter.h b/src/storm-gspn/storage/gspn/GspnJsonExporter.h
index 9c225434d..e8a55df51 100644
--- a/src/storm-gspn/storage/gspn/GspnJsonExporter.h
+++ b/src/storm-gspn/storage/gspn/GspnJsonExporter.h
@@ -4,11 +4,7 @@
 
 #include "storm-gspn/storage/gspn/GSPN.h"
 
-// JSON parser
-#include "json.hpp"
-namespace modernjson {
-    using json = nlohmann::basic_json<std::map, std::vector, std::string, bool, int64_t, uint64_t, double, std::allocator>;
-}
+#include "storm/adapters/JsonAdapter.h"
 
 namespace storm {
     namespace gspn {
@@ -19,20 +15,21 @@ namespace storm {
         class GspnJsonExporter {
 
         public:
+            typedef typename storm::json<double> Json;
             static void toStream(storm::gspn::GSPN const& gspn, std::ostream& os);
 
-            static modernjson::json translate(storm::gspn::GSPN const& gspn);
+            static Json translate(storm::gspn::GSPN const& gspn);
 
         private:
             enum ArcType { INPUT, OUTPUT, INHIBITOR };
 
-            static modernjson::json translatePlace(storm::gspn::Place const& place, double x, double y);
+            static Json translatePlace(storm::gspn::Place const& place, double x, double y);
 
-            static modernjson::json translateImmediateTransition(storm::gspn::ImmediateTransition<double> const& transition, double x, double y);
+            static Json translateImmediateTransition(storm::gspn::ImmediateTransition<double> const& transition, double x, double y);
 
-            static modernjson::json translateTimedTransition(storm::gspn::TimedTransition<double> const& transition, double x, double y);
+            static Json translateTimedTransition(storm::gspn::TimedTransition<double> const& transition, double x, double y);
 
-            static modernjson::json translateArc(storm::gspn::Transition const& transition, storm::gspn::Place const& place, uint64_t multiplicity, bool immediate, ArcType arctype);
+            static Json translateArc(storm::gspn::Transition const& transition, storm::gspn::Place const& place, uint64_t multiplicity, bool immediate, ArcType arctype);
 
             std::string static inline toJsonString(storm::gspn::Place const& place) {
                 std::stringstream stream;
diff --git a/src/storm/storage/Qvbs.cpp b/src/storm/storage/Qvbs.cpp
index cb810c948..71c012568 100644
--- a/src/storm/storage/Qvbs.cpp
+++ b/src/storm/storage/Qvbs.cpp
@@ -9,13 +9,14 @@
 #include "storm/settings/modules/IOSettings.h"
 #include "storm/exceptions/WrongFormatException.h"
 #include "storm/exceptions/InvalidArgumentException.h"
+#include "storm/utility/constants.h"
 
 namespace storm {
     namespace storage {
         
-        modernjson::json readQvbsJsonFile(std::string const& filePath) {
+        storm::json<storm::RationalNumber> readQvbsJsonFile(std::string const& filePath) {
             STORM_LOG_THROW(storm::utility::fileExistsAndIsReadable(filePath), storm::exceptions::WrongFormatException, "QVBS json file " << filePath << " was not found.");
-            modernjson::json result;
+            storm::json<storm::RationalNumber> result;
             std::ifstream file;
             storm::utility::openFile(filePath, file);
             result << file;
@@ -23,11 +24,11 @@ namespace storm {
             return result;
         }
         
-        std::string getString(modernjson::json const& structure, std::string const& errorInfo = "") {
+        std::string getString(storm::json<storm::RationalNumber> const& structure, std::string const& errorInfo = "") {
             if (structure.is_number_integer()) {
                 return std::to_string(structure.get<int64_t>());
             } else if (structure.is_number_float()) {
-                return std::to_string(structure.get<double>());
+                return storm::utility::to_string(structure.get<storm::RationalNumber>());
             } else if (structure.is_string()) {
                 return structure.get<std::string>();
             } else if (structure.is_boolean()) {
diff --git a/src/storm/storage/Qvbs.h b/src/storm/storage/Qvbs.h
index d88c28bd9..8a101d78d 100644
--- a/src/storm/storage/Qvbs.h
+++ b/src/storm/storage/Qvbs.h
@@ -4,11 +4,8 @@
 #include <vector>
 #include <boost/optional.hpp>
 
-// JSON parser
-#include "json.hpp"
-namespace modernjson {
-    using json = nlohmann::json;
-}
+#include "storm/adapters/JsonAdapter.h"
+#include "storm/adapters/RationalNumberAdapter.h"
 
 
 namespace storm {
@@ -36,7 +33,7 @@ namespace storm {
             std::vector<std::string> instanceInfos;
             
             std::string modelPath;
-            modernjson::json modelData;
+            storm::json<storm::RationalNumber> modelData;
         };
     }
 }
diff --git a/src/storm/storage/jani/JSONExporter.cpp b/src/storm/storage/jani/JSONExporter.cpp
index 2975f9ff3..bf082b3e0 100644
--- a/src/storm/storage/jani/JSONExporter.cpp
+++ b/src/storm/storage/jani/JSONExporter.cpp
@@ -39,13 +39,13 @@
 namespace storm {
     namespace jani {
 
-        modernjson::json anyToJson(boost::any&& input) {
+        ExportJsonType anyToJson(boost::any&& input) {
             boost::any tmp(std::move(input));
-            modernjson::json res = std::move(*boost::any_cast<modernjson::json>(&tmp));
+            ExportJsonType res = std::move(*boost::any_cast<ExportJsonType>(&tmp));
             return res;
         }
         
-        modernjson::json buildExpression(storm::expressions::Expression const& exp,  std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables = VariableSet(), VariableSet const& localVariables = VariableSet(), std::unordered_set<std::string> const& auxiliaryVariables = {}) {
+        ExportJsonType buildExpression(storm::expressions::Expression const& exp,  std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables = VariableSet(), VariableSet const& localVariables = VariableSet(), std::unordered_set<std::string> const& auxiliaryVariables = {}) {
             STORM_LOG_TRACE("Exporting " << exp);
             return ExpressionToJson::translate(exp,  constants, globalVariables, localVariables, auxiliaryVariables);
         }
@@ -56,27 +56,27 @@ namespace storm {
                 
             }
             
-            static modernjson::json translate(storm::jani::Composition const& comp, bool allowRecursion = true) {
+            static ExportJsonType translate(storm::jani::Composition const& comp, bool allowRecursion = true) {
                 CompositionJsonExporter visitor(allowRecursion);
                 return anyToJson(comp.accept(visitor, boost::none));
             }
             
             virtual boost::any visit(AutomatonComposition const& composition, boost::any const&) {
-                modernjson::json compDecl;
-                modernjson::json autDecl;
+                ExportJsonType compDecl;
+                ExportJsonType autDecl;
                 autDecl["automaton"] = composition.getAutomatonName();
-                std::vector<modernjson::json> elements;
+                std::vector<ExportJsonType> elements;
                 elements.push_back(autDecl);
                 compDecl["elements"] = elements;
                 return compDecl;
             }
             
             virtual boost::any visit(ParallelComposition const& composition, boost::any const& data) {
-                modernjson::json compDecl;
+                ExportJsonType compDecl;
                 
-                std::vector<modernjson::json> elems;
+                std::vector<ExportJsonType> elems;
                 for (auto const& subcomp : composition.getSubcompositions()) {
-                    modernjson::json elemDecl;
+                    ExportJsonType elemDecl;
                     if (subcomp->isAutomatonComposition()) {
                         elemDecl["automaton"] = std::static_pointer_cast<AutomatonComposition>(subcomp)->getAutomatonName();
                     } else {
@@ -86,9 +86,9 @@ namespace storm {
                     elems.push_back(elemDecl);
                 }
                 compDecl["elements"] = elems;
-                std::vector<modernjson::json> synElems;
+                std::vector<ExportJsonType> synElems;
                 for (auto const& syncs : composition.getSynchronizationVectors()) {
-                    modernjson::json syncDecl;
+                    ExportJsonType syncDecl;
                     syncDecl["synchronise"] = std::vector<std::string>();
                     for (auto const& syncIn : syncs.getInput()) {
                         if (syncIn == SynchronizationVector::NO_ACTION_INPUT) {
@@ -125,11 +125,11 @@ namespace storm {
             STORM_LOG_THROW(false, storm::exceptions::IllegalArgumentException, "Unknown ComparisonType");
         }
         
-        modernjson::json numberToJson(storm::RationalNumber rn) {
-            modernjson::json numDecl;
+        ExportJsonType numberToJson(storm::RationalNumber rn) {
+            ExportJsonType numDecl;
             numDecl = storm::utility::convertNumber<double>(rn);
 //            if(carl::isOne(carl::getDenom(rn))) {
-//                numDecl = modernjson::json(carl::toString(carl::getNum(rn)));
+//                numDecl = ExportJsonType(carl::toString(carl::getNum(rn)));
 //            } else {
 //                numDecl["op"] = "/";
 //                // TODO set json lib to work with arbitrary precision ints.
@@ -142,12 +142,12 @@ namespace storm {
         }
         
         
-        modernjson::json FormulaToJaniJson::constructPropertyInterval(boost::optional<storm::expressions::Expression> const& lower, boost::optional<bool> const& lowerExclusive, boost::optional<storm::expressions::Expression> const& upper, boost::optional<bool> const& upperExclusive) const {
+        ExportJsonType FormulaToJaniJson::constructPropertyInterval(boost::optional<storm::expressions::Expression> const& lower, boost::optional<bool> const& lowerExclusive, boost::optional<storm::expressions::Expression> const& upper, boost::optional<bool> const& upperExclusive) const {
             STORM_LOG_THROW((lower.is_initialized() || upper.is_initialized()), storm::exceptions::InvalidJaniException, "PropertyInterval needs either a lower or an upper bound, but none was given.");
             STORM_LOG_THROW((lower.is_initialized() || !lowerExclusive.is_initialized()), storm::exceptions::InvalidJaniException, "PropertyInterval defines wether the lower bound is exclusive but no lower bound is given.");
             STORM_LOG_THROW((upper.is_initialized() || !upperExclusive.is_initialized()), storm::exceptions::InvalidJaniException, "PropertyInterval defines wether the upper bound is exclusive but no upper bound is given.");
             
-            modernjson::json iDecl;
+            ExportJsonType iDecl;
             if (lower) {
                 iDecl["lower"] = buildExpression(*lower, model.getConstants(), model.getGlobalVariables());
                 if (lowerExclusive) {
@@ -163,7 +163,7 @@ namespace storm {
             return iDecl;
         }
         
-        modernjson::json FormulaToJaniJson::constructRewardAccumulation(storm::logic::RewardAccumulation const& rewardAccumulation, std::string const& rewardModelName) const {
+        ExportJsonType FormulaToJaniJson::constructRewardAccumulation(storm::logic::RewardAccumulation const& rewardAccumulation, std::string const& rewardModelName) const {
             storm::jani::RewardModelInformation info(model, rewardModelName);
             
             bool steps = rewardAccumulation.isStepsSet() && (info.hasActionRewards() || info.hasTransitionRewards());
@@ -173,7 +173,7 @@ namespace storm {
             return constructRewardAccumulation(storm::logic::RewardAccumulation(steps, time, exit));
         }
         
-        modernjson::json FormulaToJaniJson::constructRewardAccumulation(storm::logic::RewardAccumulation const& rewardAccumulation) const {
+        ExportJsonType FormulaToJaniJson::constructRewardAccumulation(storm::logic::RewardAccumulation const& rewardAccumulation) const {
             std::vector<std::string> res;
             if (rewardAccumulation.isStepsSet()) {
                 res.push_back("steps");
@@ -188,7 +188,7 @@ namespace storm {
             return res;
         }
 
-        modernjson::json FormulaToJaniJson::constructStandardRewardAccumulation(std::string const& rewardModelName) const {
+        ExportJsonType FormulaToJaniJson::constructStandardRewardAccumulation(std::string const& rewardModelName) const {
             if (model.isDiscreteTimeModel()) {
                 return constructRewardAccumulation(storm::logic::RewardAccumulation(true, false, true), rewardModelName);
             } else {
@@ -196,7 +196,7 @@ namespace storm {
             }
         }
         
-        modernjson::json FormulaToJaniJson::translate(storm::logic::Formula const& formula, storm::jani::Model const& model, storm::jani::ModelFeatures& modelFeatures) {
+        ExportJsonType FormulaToJaniJson::translate(storm::logic::Formula const& formula, storm::jani::Model const& model, storm::jani::ModelFeatures& modelFeatures) {
             FormulaToJaniJson translator(model);
             auto result = anyToJson(formula.accept(translator));
             if (translator.containsStateExitRewards()) {
@@ -214,11 +214,11 @@ namespace storm {
         }
         
         boost::any FormulaToJaniJson::visit(storm::logic::AtomicLabelFormula const& f, boost::any const&) const {
-            modernjson::json opDecl(f.getLabel());
+            ExportJsonType opDecl(f.getLabel());
             return opDecl;
         }
         boost::any FormulaToJaniJson::visit(storm::logic::BinaryBooleanStateFormula const& f, boost::any const& data) const{
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             storm::logic::BinaryBooleanStateFormula::OperatorType op = f.getOperator();
             opDecl["op"] = op == storm::logic::BinaryBooleanStateFormula::OperatorType::And ? "∧" : "∨";
             opDecl["left"] = anyToJson(f.getLeftSubformula().accept(*this, data));
@@ -226,18 +226,18 @@ namespace storm {
             return opDecl;
         }
         boost::any FormulaToJaniJson::visit(storm::logic::BooleanLiteralFormula const& f, boost::any const&) const {
-            modernjson::json opDecl(f.isTrueFormula() ? true : false);
+            ExportJsonType opDecl(f.isTrueFormula() ? true : false);
             return opDecl;
         }
         boost::any FormulaToJaniJson::visit(storm::logic::BoundedUntilFormula const& f, boost::any const& data) const {
             STORM_LOG_THROW(!f.hasMultiDimensionalSubformulas(), storm::exceptions::NotSupportedException, "Jani export of multi-dimensional bounded until formulas is not supported.");
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = "U";
             opDecl["left"] = anyToJson(f.getLeftSubformula().accept(*this, data));
             opDecl["right"] = anyToJson(f.getRightSubformula().accept(*this, data));
             
             bool hasStepBounds(false), hasTimeBounds(false);
-            std::vector<modernjson::json> rewardBounds;
+            std::vector<ExportJsonType> rewardBounds;
             
             for (uint64_t i = 0; i < f.getDimension(); ++i) {
                 boost::optional<storm::expressions::Expression> lower, upper;
@@ -250,7 +250,7 @@ namespace storm {
                     upper = f.getUpperBound(i);
                     upperExclusive = f.isUpperBoundStrict(i);
                 }
-                modernjson::json propertyInterval = constructPropertyInterval(lower, lowerExclusive, upper, upperExclusive);
+                ExportJsonType propertyInterval = constructPropertyInterval(lower, lowerExclusive, upper, upperExclusive);
     
                 auto tbr = f.getTimeBoundReference(i);
                 if (tbr.isStepBound() || (model.isDiscreteTimeModel() && tbr.isTimeBound())) {
@@ -258,7 +258,7 @@ namespace storm {
                     hasStepBounds = true;
                     opDecl["step-bounds"] = propertyInterval;
                 } else if(tbr.isRewardBound()) {
-                    modernjson::json rewbound;
+                    ExportJsonType rewbound;
                     rewbound["exp"] = buildExpression(model.getRewardModelExpression(tbr.getRewardName()), model.getConstants(), model.getGlobalVariables());
                     if (tbr.hasRewardAccumulation()) {
                         rewbound["accumulate"] = constructRewardAccumulation(tbr.getRewardAccumulation(), tbr.getRewardName());
@@ -274,7 +274,7 @@ namespace storm {
                 }
             }
             if (!rewardBounds.empty()) {
-                opDecl["reward-bounds"] = modernjson::json(rewardBounds);
+                opDecl["reward-bounds"] = ExportJsonType(rewardBounds);
             }
             return opDecl;
 
@@ -289,7 +289,7 @@ namespace storm {
         }
         
         boost::any FormulaToJaniJson::visit(storm::logic::EventuallyFormula const& f, boost::any const& data) const {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = "U";
             opDecl["left"] = anyToJson(f.getTrueFormula()->accept(*this, data));
             opDecl["right"] = anyToJson(f.getSubformula().accept(*this, data));
@@ -297,7 +297,7 @@ namespace storm {
         }
         
         boost::any FormulaToJaniJson::visit(storm::logic::TimeOperatorFormula const& f, boost::any const& data) const {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             
             // Create standard reward accumulation for time operator formulas.
             storm::logic::RewardAccumulation rewAcc(model.isDiscreteTimeModel(), !model.isDiscreteTimeModel(), false);
@@ -320,7 +320,7 @@ namespace storm {
                     opDecl["left"]["op"] = (bound.comparisonType == storm::logic::ComparisonType::Less || bound.comparisonType == storm::logic::ComparisonType::LessEqual) ? "Emax" : "Emin";
                     opDecl["left"]["reach"] = anyToJson(f.getSubformula().asEventuallyFormula().getSubformula().accept(*this, data));
                 }
-                opDecl["left"]["exp"] = modernjson::json(1);
+                opDecl["left"]["exp"] = ExportJsonType(1);
                 opDecl["left"]["accumulate"] = rewAccJson;
                 opDecl["right"] = buildExpression(bound.threshold, model.getConstants(), model.getGlobalVariables());
             } else {
@@ -336,14 +336,14 @@ namespace storm {
                     opDecl["op"] = "Emin";
                     opDecl["reach"] = anyToJson(f.getSubformula().asEventuallyFormula().getSubformula().accept(*this, data));
                 }
-                opDecl["exp"] = modernjson::json(1);
+                opDecl["exp"] = ExportJsonType(1);
                 opDecl["accumulate"] = rewAccJson;
             }
             return opDecl;
         }
         
         boost::any FormulaToJaniJson::visit(storm::logic::GloballyFormula const& f, boost::any const& data) const {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = "G";
             opDecl["exp"] = anyToJson(f.getSubformula().accept(*this, data));
             return opDecl;
@@ -354,7 +354,7 @@ namespace storm {
         }
         
         boost::any FormulaToJaniJson::visit(storm::logic::LongRunAverageOperatorFormula const& f, boost::any const& data) const {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             if(f.hasBound()) {
                 auto bound = f.getBound();
                 opDecl["op"] = comparisonTypeToJani(bound.comparisonType);
@@ -381,7 +381,7 @@ namespace storm {
         }
         
         boost::any FormulaToJaniJson::visit(storm::logic::LongRunAverageRewardFormula const&, boost::any const&) const {
-//            modernjson::json opDecl;
+//            ExportJsonType opDecl;
 //            if(f.()) {
 //                auto bound = f.getBound();
 //                opDecl["op"] = comparisonTypeToJani(bound.comparisonType);
@@ -419,7 +419,7 @@ namespace storm {
         }
         
         boost::any FormulaToJaniJson::visit(storm::logic::NextFormula const& f, boost::any const& data) const {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = "U";
             opDecl["left"] = anyToJson(f.getTrueFormula()->accept(*this, data));
             opDecl["right"] = anyToJson(f.getSubformula().accept(*this, data));
@@ -432,7 +432,7 @@ namespace storm {
         
         
         boost::any FormulaToJaniJson::visit(storm::logic::ProbabilityOperatorFormula const& f, boost::any const& data) const {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             
             if(f.hasBound()) {
                 auto bound = f.getBound();
@@ -460,7 +460,7 @@ namespace storm {
         }
         
         boost::any FormulaToJaniJson::visit(storm::logic::RewardOperatorFormula const& f, boost::any const& data) const {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             
             std::string instantName;
             if (model.isDiscreteTimeModel()) {
@@ -529,7 +529,7 @@ namespace storm {
             opDecl["exp"] = buildExpression(model.getRewardModelExpression(rewardModelName), model.getConstants(), model.getGlobalVariables());
             
             if(f.hasBound()) {
-                modernjson::json compDecl;
+                ExportJsonType compDecl;
                 auto bound = f.getBound();
                 compDecl["op"] = comparisonTypeToJani(bound.comparisonType);
                 compDecl["left"] = std::move(opDecl);
@@ -545,7 +545,7 @@ namespace storm {
         }
         
         boost::any FormulaToJaniJson::visit(storm::logic::UnaryBooleanStateFormula const& f, boost::any const& data) const {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             storm::logic::UnaryBooleanStateFormula::OperatorType op = f.getOperator();
             assert(op == storm::logic::UnaryBooleanStateFormula::OperatorType::Not);
             opDecl["op"] = "¬";
@@ -554,7 +554,7 @@ namespace storm {
         }
         
         boost::any FormulaToJaniJson::visit(storm::logic::UntilFormula const& f, boost::any const& data) const {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = "U";
             opDecl["left"] = anyToJson(f.getLeftSubformula().accept(*this, data));
             opDecl["right"] = anyToJson(f.getRightSubformula().accept(*this, data));
@@ -616,7 +616,7 @@ namespace storm {
             }
         }
         
-        modernjson::json ExpressionToJson::translate(storm::expressions::Expression const& expr, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, std::unordered_set<std::string> const& auxiliaryVariables) {
+        ExportJsonType ExpressionToJson::translate(storm::expressions::Expression const& expr, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, std::unordered_set<std::string> const& auxiliaryVariables) {
             
             // Simplify the expression first and reduce the nesting
             auto simplifiedExpr = storm::jani::reduceNestingInJaniExpression(expr.simplify());
@@ -626,7 +626,7 @@ namespace storm {
         }
         
         boost::any ExpressionToJson::visit(storm::expressions::IfThenElseExpression const& expression, boost::any const& data) {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = "ite";
             opDecl["if"] = anyToJson(expression.getCondition()->accept(*this, data));
             opDecl["then"] = anyToJson(expression.getThenExpression()->accept(*this, data));
@@ -634,21 +634,21 @@ namespace storm {
             return opDecl;
         }
         boost::any ExpressionToJson::visit(storm::expressions::BinaryBooleanFunctionExpression const& expression, boost::any const& data) {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = operatorTypeToJaniString(expression.getOperator());
             opDecl["left"] = anyToJson(expression.getOperand(0)->accept(*this, data));
             opDecl["right"] = anyToJson(expression.getOperand(1)->accept(*this, data));
             return opDecl;
         }
         boost::any ExpressionToJson::visit(storm::expressions::BinaryNumericalFunctionExpression const& expression, boost::any const& data) {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = operatorTypeToJaniString(expression.getOperator());
             opDecl["left"] = anyToJson(expression.getOperand(0)->accept(*this, data));
             opDecl["right"] = anyToJson(expression.getOperand(1)->accept(*this, data));
             return opDecl;
         }
         boost::any ExpressionToJson::visit(storm::expressions::BinaryRelationExpression const& expression, boost::any const& data) {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = operatorTypeToJaniString(expression.getOperator());
             opDecl["left"] = anyToJson(expression.getOperand(0)->accept(*this, data));
             opDecl["right"] = anyToJson(expression.getOperand(1)->accept(*this, data));
@@ -656,47 +656,47 @@ namespace storm {
         }
         boost::any ExpressionToJson::visit(storm::expressions::VariableExpression const& expression, boost::any const&) {
             if (auxiliaryVariables.count(expression.getVariableName())) {
-                return modernjson::json(expression.getVariableName());
+                return ExportJsonType(expression.getVariableName());
             } else if (globalVariables.hasVariable(expression.getVariable())) {
-                return modernjson::json(globalVariables.getVariable(expression.getVariable()).getName());
+                return ExportJsonType(globalVariables.getVariable(expression.getVariable()).getName());
             } else if (localVariables.hasVariable(expression.getVariable())) {
-                return modernjson::json(localVariables.getVariable(expression.getVariable()).getName());
+                return ExportJsonType(localVariables.getVariable(expression.getVariable()).getName());
             } else {
                 for (auto const& constant : constants) {
                     if (constant.getExpressionVariable() == expression.getVariable()) {
-                        return modernjson::json(constant.getName());
+                        return ExportJsonType(constant.getName());
                     }
                 }
             }
             STORM_LOG_THROW(false, storm::exceptions::InvalidJaniException, "Expression variable '" << expression.getVariableName() << "' not known in Jani data structures.");
-            return modernjson::json(); // should not reach this point.
+            return ExportJsonType(); // should not reach this point.
         }
         boost::any ExpressionToJson::visit(storm::expressions::UnaryBooleanFunctionExpression const& expression, boost::any const& data) {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = operatorTypeToJaniString(expression.getOperator());
             opDecl["exp"] = anyToJson(expression.getOperand()->accept(*this, data));
             return opDecl;
         }
         boost::any ExpressionToJson::visit(storm::expressions::UnaryNumericalFunctionExpression const& expression, boost::any const& data) {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = operatorTypeToJaniString(expression.getOperator());
             opDecl["exp"] = anyToJson(expression.getOperand()->accept(*this, data));
             return opDecl;
         }
         boost::any ExpressionToJson::visit(storm::expressions::BooleanLiteralExpression const& expression, boost::any const&) {
-            return modernjson::json(expression.getValue());
+            return ExportJsonType(expression.getValue());
         }
         boost::any ExpressionToJson::visit(storm::expressions::IntegerLiteralExpression const& expression, boost::any const&) {
-            return modernjson::json(expression.getValue());
+            return ExportJsonType(expression.getValue());
         }
         boost::any ExpressionToJson::visit(storm::expressions::RationalLiteralExpression const& expression, boost::any const&) {
-            return modernjson::json(expression.getValueAsDouble());
+            return ExportJsonType(expression.getValueAsDouble());
         }
         
         boost::any ExpressionToJson::visit(storm::expressions::ValueArrayExpression const& expression, boost::any const& data) {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = "av";
-            std::vector<modernjson::json> elements;
+            std::vector<ExportJsonType> elements;
             uint64_t size = expression.size()->evaluateAsInt();
             for (uint64_t i = 0; i < size; ++i) {
                 elements.push_back(anyToJson(expression.at(i)->accept(*this, data)));
@@ -706,7 +706,7 @@ namespace storm {
         }
         
         boost::any ExpressionToJson::visit(storm::expressions::ConstructorArrayExpression const& expression, boost::any const& data) {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = "ac";
             opDecl["var"] = expression.getIndexVar().getName();
             opDecl["length"] = anyToJson(expression.size()->accept(*this, data));
@@ -719,7 +719,7 @@ namespace storm {
         }
         
         boost::any ExpressionToJson::visit(storm::expressions::ArrayAccessExpression const& expression, boost::any const& data) {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = "aa";
             opDecl["exp"] = anyToJson(expression.getOperand(0)->accept(*this, data));
             opDecl["index"] = anyToJson(expression.getOperand(1)->accept(*this, data));
@@ -727,10 +727,10 @@ namespace storm {
         }
         
         boost::any ExpressionToJson::visit(storm::expressions::FunctionCallExpression const& expression, boost::any const& data) {
-            modernjson::json opDecl;
+            ExportJsonType opDecl;
             opDecl["op"] = "call";
             opDecl["function"] = expression.getFunctionIdentifier();
-            std::vector<modernjson::json> arguments;
+            std::vector<ExportJsonType> arguments;
             for (uint64_t i = 0; i < expression.getNumberOfArguments(); ++i) {
                 arguments.push_back(anyToJson(expression.getArgument(i)->accept(*this, data)));
             }
@@ -766,8 +766,8 @@ namespace storm {
             STORM_LOG_INFO("Conversion completed " << janiModel.getName() << ".");
         }
         
-        modernjson::json buildActionArray(std::vector<storm::jani::Action> const& actions) {
-            std::vector<modernjson::json> actionReprs;
+        ExportJsonType buildActionArray(std::vector<storm::jani::Action> const& actions) {
+            std::vector<ExportJsonType> actionReprs;
             uint64_t actIndex = 0;
             for(auto const& act : actions) {
                 if(actIndex == storm::jani::Model::SILENT_ACTION_INDEX) {
@@ -775,17 +775,17 @@ namespace storm {
                     continue;
                 }
                 actIndex++;
-                modernjson::json actEntry;
+                ExportJsonType actEntry;
                 actEntry["name"] = act.getName();
                 actionReprs.push_back(actEntry);
             }
             
-            return modernjson::json(actionReprs);
+            return ExportJsonType(actionReprs);
             
         }
         
-        modernjson::json buildTypeDescription(storm::expressions::Type const& type) {
-            modernjson::json typeDescr;
+        ExportJsonType buildTypeDescription(storm::expressions::Type const& type) {
+            ExportJsonType typeDescr;
             if (type.isIntegerType()) {
                 typeDescr = "int";
             } else if (type.isRationalType()) {
@@ -801,7 +801,7 @@ namespace storm {
             return typeDescr;
         }
         
-        void getBoundsFromConstraints(modernjson::json& typeDesc, storm::expressions::Variable const& var, storm::expressions::Expression const& constraint, std::vector<storm::jani::Constant> const& constants) {
+        void getBoundsFromConstraints(ExportJsonType& typeDesc, storm::expressions::Variable const& var, storm::expressions::Expression const& constraint, std::vector<storm::jani::Constant> const& constants) {
             if (constraint.getBaseExpression().isBinaryBooleanFunctionExpression() && constraint.getBaseExpression().getOperator() == storm::expressions::OperatorType::And) {
                 getBoundsFromConstraints(typeDesc, var, constraint.getBaseExpression().getOperand(0), constants);
                 getBoundsFromConstraints(typeDesc, var, constraint.getBaseExpression().getOperand(1), constants);
@@ -825,12 +825,12 @@ namespace storm {
             }
         }
         
-        modernjson::json buildConstantsArray(std::vector<storm::jani::Constant> const& constants) {
-            std::vector<modernjson::json> constantDeclarations;
+        ExportJsonType buildConstantsArray(std::vector<storm::jani::Constant> const& constants) {
+            std::vector<ExportJsonType> constantDeclarations;
             for(auto const& constant : constants) {
-                modernjson::json constantEntry;
+                ExportJsonType constantEntry;
                 constantEntry["name"] = constant.getName();
-                modernjson::json typeDesc;
+                ExportJsonType typeDesc;
                 if (constant.hasConstraint()) {
                     typeDesc["kind"] = "bounded";
                     typeDesc["base"] = buildTypeDescription(constant.getType());
@@ -844,19 +844,19 @@ namespace storm {
                 }
                 constantDeclarations.push_back(constantEntry);
             }
-            return modernjson::json(constantDeclarations);
+            return ExportJsonType(constantDeclarations);
         }
         
         
-        modernjson::json buildVariablesArray(storm::jani::VariableSet const& varSet, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables = VariableSet()) {
-            modernjson::json variableDeclarations = std::vector<modernjson::json>();
+        ExportJsonType buildVariablesArray(storm::jani::VariableSet const& varSet, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables = VariableSet()) {
+            ExportJsonType variableDeclarations = std::vector<ExportJsonType>();
             for(auto const& variable : varSet) {
-                modernjson::json varEntry;
+                ExportJsonType varEntry;
                 varEntry["name"] = variable.getName();
                 if (variable.isTransient()) {
                     varEntry["transient"] = variable.isTransient();
                 }
-                modernjson::json typeDesc;
+                ExportJsonType typeDesc;
                 if(variable.isBooleanVariable()) {
                     typeDesc = "bool";
                 } else if (variable.isRealVariable()) {
@@ -879,7 +879,7 @@ namespace storm {
                             break;
                         case storm::jani::ArrayVariable::ElementType::Int:
                             if (variable.asArrayVariable().hasElementTypeBound()) {
-                                modernjson::json baseTypeDescr;
+                                ExportJsonType baseTypeDescr;
                                 baseTypeDescr["kind"] = "bounded";
                                 baseTypeDescr["base "] = "int";
                                 if (variable.asArrayVariable().hasLowerElementTypeBound()) {
@@ -907,17 +907,17 @@ namespace storm {
             return variableDeclarations;
         }
 
-        modernjson::json buildFunctionsArray(std::unordered_map<std::string, FunctionDefinition> const& functionDefinitions, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables = VariableSet()) {
-            modernjson::json functionDeclarations = std::vector<modernjson::json>();
+        ExportJsonType buildFunctionsArray(std::unordered_map<std::string, FunctionDefinition> const& functionDefinitions, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables = VariableSet()) {
+            ExportJsonType functionDeclarations = std::vector<ExportJsonType>();
             for (auto const& nameFunDef : functionDefinitions) {
                 storm::jani::FunctionDefinition const& funDef = nameFunDef.second;
-                modernjson::json funDefJson;
+                ExportJsonType funDefJson;
                 funDefJson["name"] = nameFunDef.first;
                 funDefJson["type"] = buildTypeDescription(funDef.getType());
-                std::vector<modernjson::json> parameterDeclarations;
+                std::vector<ExportJsonType> parameterDeclarations;
                 std::unordered_set<std::string> parameterNames;
                 for (auto const& p : funDef.getParameters()) {
-                    modernjson::json parDefJson;
+                    ExportJsonType parDefJson;
                     parDefJson["name"] = p.getName();
                     parameterNames.insert(p.getName());
                     parDefJson["type"] = buildTypeDescription(p.getType());
@@ -930,16 +930,16 @@ namespace storm {
             return functionDeclarations;
         }
         
-        modernjson::json buildAssignmentArray(storm::jani::OrderedAssignments const& orderedAssignments, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, bool commentExpressions) {
-            modernjson::json assignmentDeclarations = std::vector<modernjson::json>();
+        ExportJsonType buildAssignmentArray(storm::jani::OrderedAssignments const& orderedAssignments, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, bool commentExpressions) {
+            ExportJsonType assignmentDeclarations = std::vector<ExportJsonType>();
             bool addIndex = orderedAssignments.hasMultipleLevels();
             for(auto const& assignment : orderedAssignments) {
-                modernjson::json assignmentEntry;
+                ExportJsonType assignmentEntry;
                 if (assignment.getLValue().isVariable()) {
                     assignmentEntry["ref"] = assignment.getVariable().getName();
                 } else {
                     STORM_LOG_ASSERT(assignment.getLValue().isArrayAccess(), "Unhandled LValue " << assignment.getLValue());
-                    modernjson::json arrayAccess;
+                    ExportJsonType arrayAccess;
                     arrayAccess["op"] = "aa";
                     arrayAccess["exp"] = assignment.getLValue().getArray().getName();
                     arrayAccess["index"] = buildExpression(assignment.getLValue().getArrayIndex(), constants, globalVariables, localVariables);
@@ -957,13 +957,13 @@ namespace storm {
             return assignmentDeclarations;
         }
         
-        modernjson::json buildLocationsArray(std::vector<storm::jani::Location> const& locations, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, bool commentExpressions) {
-            modernjson::json locationDeclarations = std::vector<modernjson::json>();
+        ExportJsonType buildLocationsArray(std::vector<storm::jani::Location> const& locations, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, bool commentExpressions) {
+            ExportJsonType locationDeclarations = std::vector<ExportJsonType>();
             for(auto const& location : locations) {
-                modernjson::json locEntry;
+                ExportJsonType locEntry;
                 locEntry["name"] = location.getName();
                 if (location.hasTimeProgressInvariant()) {
-                    modernjson::json timeProg;
+                    ExportJsonType timeProg;
                     timeProg["exp"] = buildExpression(location.getTimeProgressInvariant(), constants, globalVariables, localVariables);
                     if (commentExpressions) {
                         timeProg["comment"] = location.getTimeProgressInvariant().toString();
@@ -978,19 +978,19 @@ namespace storm {
             return locationDeclarations;
         }
         
-        modernjson::json buildInitialLocations(storm::jani::Automaton const& automaton) {
+        ExportJsonType buildInitialLocations(storm::jani::Automaton const& automaton) {
             std::vector<std::string> names;
             for(auto const& initLocIndex : automaton.getInitialLocationIndices()) {
                 names.push_back(automaton.getLocation(initLocIndex).getName());
             }
-            return modernjson::json(names);
+            return ExportJsonType(names);
         }
         
-        modernjson::json buildDestinations(std::vector<EdgeDestination> const& destinations, std::map<uint64_t, std::string> const& locationNames, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, bool commentExpressions) {
+        ExportJsonType buildDestinations(std::vector<EdgeDestination> const& destinations, std::map<uint64_t, std::string> const& locationNames, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, bool commentExpressions) {
             assert(destinations.size() > 0);
-            modernjson::json destDeclarations = std::vector<modernjson::json>();
+            ExportJsonType destDeclarations = std::vector<ExportJsonType>();
             for(auto const& destination : destinations) {
-                modernjson::json destEntry;
+                ExportJsonType destEntry;
                 destEntry["location"] = locationNames.at(destination.getLocationIndex());
                 bool prob1 = false;
                 if(destination.getProbability().isLiteral()) {
@@ -1012,14 +1012,14 @@ namespace storm {
             return destDeclarations;
         }
         
-        modernjson::json buildEdges(std::vector<Edge> const& edges , std::map<uint64_t, std::string> const& actionNames, std::map<uint64_t, std::string> const& locationNames, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, bool commentExpressions) {
-            modernjson::json edgeDeclarations = std::vector<modernjson::json>();
+        ExportJsonType buildEdges(std::vector<Edge> const& edges , std::map<uint64_t, std::string> const& actionNames, std::map<uint64_t, std::string> const& locationNames, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, bool commentExpressions) {
+            ExportJsonType edgeDeclarations = std::vector<ExportJsonType>();
             for(auto const& edge : edges) {
                 if (edge.getGuard().isFalse()) {
                     continue;
                 }
                 STORM_LOG_THROW(edge.getDestinations().size() > 0, storm::exceptions::InvalidJaniException, "An edge without destinations is not allowed.");
-                modernjson::json edgeEntry;
+                ExportJsonType edgeEntry;
                 edgeEntry["location"] = locationNames.at(edge.getSourceLocationIndex());
                 if(!edge.hasSilentAction()) {
                     edgeEntry["action"] = actionNames.at(edge.getActionIndex());
@@ -1046,10 +1046,10 @@ namespace storm {
             return edgeDeclarations;
         }
         
-        modernjson::json buildAutomataArray(std::vector<storm::jani::Automaton> const& automata, std::map<uint64_t, std::string> const& actionNames, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, bool commentExpressions) {
-            modernjson::json automataDeclarations = std::vector<modernjson::json>();
+        ExportJsonType buildAutomataArray(std::vector<storm::jani::Automaton> const& automata, std::map<uint64_t, std::string> const& actionNames, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, bool commentExpressions) {
+            ExportJsonType automataDeclarations = std::vector<ExportJsonType>();
             for(auto const& automaton : automata) {
-                modernjson::json autoEntry;
+                ExportJsonType autoEntry;
                 autoEntry["name"] = automaton.getName();
                 autoEntry["variables"] = buildVariablesArray(automaton.getVariables(), constants, globalVariables, automaton.getVariables());
                 if (!automaton.getFunctionDefinitions().empty()) {
@@ -1108,8 +1108,8 @@ namespace storm {
             STORM_LOG_THROW(false, storm::exceptions::IllegalArgumentException, "Unknown FilterType");
         }
         
-        modernjson::json convertFilterExpression(storm::jani::FilterExpression const& fe, storm::jani::Model const& model, storm::jani::ModelFeatures& modelFeatures) {
-            modernjson::json propDecl;
+        ExportJsonType convertFilterExpression(storm::jani::FilterExpression const& fe, storm::jani::Model const& model, storm::jani::ModelFeatures& modelFeatures) {
+            ExportJsonType propDecl;
             propDecl["states"]["op"] = "initial";
             propDecl["op"] = "filter";
             propDecl["fun"] = janiFilterTypeString(fe.getFilterType());
@@ -1119,18 +1119,18 @@ namespace storm {
         
         
         void JsonExporter::convertProperties( std::vector<storm::jani::Property> const& formulas, storm::jani::Model const& model) {
-            modernjson::json properties;
+            ExportJsonType properties;
             
             // Unset model-features that only relate to properties. These are only set if such properties actually exist.
             modelFeatures.remove(storm::jani::ModelFeature::StateExitRewards);
             if (formulas.empty()) {
-                jsonStruct["properties"] = modernjson::json(modernjson::json::value_t::array);
+                jsonStruct["properties"] = ExportJsonType(ExportJsonType::value_t::array);
                 return;
             }
 
             uint64_t index = 0;
             for(auto const& f : formulas) {
-                modernjson::json propDecl;
+                ExportJsonType propDecl;
                 propDecl["name"] = f.getName();
                 propDecl["expression"] = convertFilterExpression(f.getFilter(), model, modelFeatures);
                 ++index;
@@ -1139,8 +1139,8 @@ namespace storm {
             jsonStruct["properties"] = std::move(properties);
         }
         
-        modernjson::json JsonExporter::finalize() {
-            jsonStruct["features"] = modernjson::json::parse(modelFeatures.toString());
+        ExportJsonType JsonExporter::finalize() {
+            jsonStruct["features"] = ExportJsonType::parse(modelFeatures.toString());
             return jsonStruct;
         }
 
diff --git a/src/storm/storage/jani/JSONExporter.h b/src/storm/storage/jani/JSONExporter.h
index 9a99a443a..ba2489b03 100644
--- a/src/storm/storage/jani/JSONExporter.h
+++ b/src/storm/storage/jani/JSONExporter.h
@@ -7,19 +7,17 @@
 #include "storm/storage/jani/Model.h"
 #include "storm/storage/jani/Property.h"
 #include "storm/adapters/RationalNumberAdapter.h"
-// JSON parser
-#include "json.hpp"
-namespace modernjson {
-    using json = nlohmann::json;
-}
+#include "storm/adapters/JsonAdapter.h"
 
 namespace storm {
     namespace jani {
+
+        typedef storm::json<double> ExportJsonType;
         
         class ExpressionToJson : public storm::expressions::ExpressionVisitor, public storm::expressions::JaniExpressionVisitor {
             
         public:
-            static modernjson::json translate(storm::expressions::Expression const& expr, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, std::unordered_set<std::string> const& auxiliaryVariables);
+            static ExportJsonType translate(storm::expressions::Expression const& expr, std::vector<storm::jani::Constant> const& constants, VariableSet const& globalVariables, VariableSet const& localVariables, std::unordered_set<std::string> const& auxiliaryVariables);
             
             virtual boost::any visit(storm::expressions::IfThenElseExpression const& expression, boost::any const& data);
             virtual boost::any visit(storm::expressions::BinaryBooleanFunctionExpression const& expression, boost::any const& data);
@@ -48,7 +46,7 @@ namespace storm {
         class FormulaToJaniJson : public storm::logic::FormulaVisitor {
             
         public:
-            static modernjson::json translate(storm::logic::Formula const& formula, storm::jani::Model const& model, storm::jani::ModelFeatures& modelFeatures);
+            static ExportJsonType translate(storm::logic::Formula const& formula, storm::jani::Model const& model, storm::jani::ModelFeatures& modelFeatures);
             bool containsStateExitRewards() const; // Returns true iff the  previously translated formula contained state exit rewards
             virtual boost::any visit(storm::logic::AtomicExpressionFormula const& f, boost::any const& data) const;
             virtual boost::any visit(storm::logic::AtomicLabelFormula const& f, boost::any const& data) const;
@@ -75,20 +73,19 @@ namespace storm {
         private:
             FormulaToJaniJson(storm::jani::Model const& model) : model(model), stateExitRewards(false) { }
 
-            modernjson::json constructPropertyInterval(boost::optional<storm::expressions::Expression> const& lower, boost::optional<bool> const& lowerExclusive, boost::optional<storm::expressions::Expression> const& upper, boost::optional<bool> const& upperExclusive) const;
+            ExportJsonType constructPropertyInterval(boost::optional<storm::expressions::Expression> const& lower, boost::optional<bool> const& lowerExclusive, boost::optional<storm::expressions::Expression> const& upper, boost::optional<bool> const& upperExclusive) const;
             
-            modernjson::json constructRewardAccumulation(storm::logic::RewardAccumulation const& rewardAccumulation) const;
-            modernjson::json constructRewardAccumulation(storm::logic::RewardAccumulation const& rewardAccumulation, std::string const& rewardModelName) const;
-            modernjson::json constructStandardRewardAccumulation(std::string const& rewardModelName) const;
+            ExportJsonType constructRewardAccumulation(storm::logic::RewardAccumulation const& rewardAccumulation) const;
+            ExportJsonType constructRewardAccumulation(storm::logic::RewardAccumulation const& rewardAccumulation, std::string const& rewardModelName) const;
+            ExportJsonType constructStandardRewardAccumulation(std::string const& rewardModelName) const;
 
             storm::jani::Model const& model;
             mutable bool stateExitRewards;
         };
         
         class JsonExporter {
-            JsonExporter() = default;
-            
         public:
+            JsonExporter() = default;
             static void toFile(storm::jani::Model const& janiModel, std::vector<storm::jani::Property> const& formulas, std::string const& filepath, bool checkValid = true, bool compact = false);
             static void toStream(storm::jani::Model const& janiModel, std::vector<storm::jani::Property> const& formulas, std::ostream& ostream, bool checkValid = false, bool compact = false);
             
@@ -98,9 +95,9 @@ namespace storm {
             void convertProperties(std::vector<storm::jani::Property> const& formulas, storm::jani::Model const& model);
             void appendVariableDeclaration(storm::jani::Variable const& variable);
             
-            modernjson::json finalize();
+            ExportJsonType finalize();
             
-            modernjson::json jsonStruct;
+            ExportJsonType jsonStruct;
             storm::jani::ModelFeatures modelFeatures;
             
         };