introduce INJA_DATA_TYPE
diff --git a/README.md b/README.md
index 0bf6de5..4c3b18e 100644
--- a/README.md
+++ b/README.md
@@ -44,7 +44,6 @@
 
 // Just for convenience
 using namespace inja;
-using json = nlohmann::json;
 ```
 
 If you are using the [Meson Build System](http://mesonbuild.com), then you can wrap this repository as a subproject.
diff --git a/include/inja/inja.hpp b/include/inja/inja.hpp
index 569edc2..f6d3d6e 100644
--- a/include/inja/inja.hpp
+++ b/include/inja/inja.hpp
@@ -28,7 +28,11 @@
 #include <nlohmann/json.hpp>
 
 namespace inja {
+#ifndef INJA_DATA_TYPE
   using json = nlohmann::json;
+#else
+  using json = INJA_DATA_TYPE;
+#endif
 }
 
 #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(INJA_NOEXCEPTION)
diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp
index 7cbdb97..b0f571b 100644
--- a/single_include/inja/inja.hpp
+++ b/single_include/inja/inja.hpp
@@ -28,7 +28,11 @@
 #include <nlohmann/json.hpp>
 
 namespace inja {
+#ifndef INJA_DATA_TYPE
   using json = nlohmann::json;
+#else
+  using json = INJA_DATA_TYPE;
+#endif
 }
 
 #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(INJA_NOEXCEPTION)
diff --git a/test/test-files.cpp b/test/test-files.cpp
index d1f859c..2de97fc 100644
--- a/test/test-files.cpp
+++ b/test/test-files.cpp
@@ -2,7 +2,7 @@
 
 TEST_CASE("loading") {
   inja::Environment env;
-  json data;
+  inja::json data;
   data["name"] = "Jeff";
 
   SUBCASE("Files should be loaded") { CHECK(env.load_file(test_file_directory + "simple.txt") == "Hello {{ name }}."); }
@@ -58,7 +58,7 @@
 TEST_CASE("global-path") {
   inja::Environment env {test_file_directory, "./"};
   inja::Environment env_result {"./"};
-  json data;
+  inja::json data;
   data["name"] = "Jeff";
 
   SUBCASE("Files should be written") {
@@ -79,7 +79,7 @@
 TEST_CASE("include-in-memory-and-file-template") {
   inja::Environment env {test_file_directory};
 
-  json data;
+  inja::json data;
   data["name"] = "Jeff";
 
   CHECK_THROWS_WITH(env.render_file("include-both.txt", data), "[inja.exception.file_error] failed accessing file at '../test/data/body'");
diff --git a/test/test-functions.cpp b/test/test-functions.cpp
index 8640885..92eca89 100644
--- a/test/test-functions.cpp
+++ b/test/test-functions.cpp
@@ -3,7 +3,7 @@
 TEST_CASE("functions") {
   inja::Environment env;
 
-  json data;
+  inja::json data;
   data["name"] = "Peter";
   data["city"] = "New York";
   data["names"] = {"Jeff", "Seb", "Peter", "Tom"};
@@ -199,7 +199,7 @@
 
 TEST_CASE("assignments") {
   inja::Environment env;
-  json data;
+  inja::json data;
   data["age"] = 28;
 
   CHECK(env.render("{% set new_hour=23 %}{{ new_hour }}", data) == "23");
@@ -209,7 +209,7 @@
 
 TEST_CASE("callbacks") {
   inja::Environment env;
-  json data;
+  inja::json data;
   data["age"] = 28;
 
   env.add_callback("double", 1, [](inja::Arguments &args) {
@@ -262,7 +262,7 @@
 
   SUBCASE("Variadic") {
     env.add_callback("argmax", [](inja::Arguments& args) {
-      auto result = std::max_element(args.begin(), args.end(), [](const json* a, const json* b) { return *a < *b;});
+      auto result = std::max_element(args.begin(), args.end(), [](const inja::json* a, const inja::json* b) { return *a < *b;});
       return std::distance(args.begin(), result);
     });
 
@@ -273,7 +273,7 @@
 
 TEST_CASE("combinations") {
   inja::Environment env;
-  json data;
+  inja::json data;
   data["name"] = "Peter";
   data["city"] = "Brunswick";
   data["age"] = 29;
diff --git a/test/test-renderer.cpp b/test/test-renderer.cpp
index e06b803..35f423d 100644
--- a/test/test-renderer.cpp
+++ b/test/test-renderer.cpp
@@ -2,7 +2,7 @@
 
 TEST_CASE("types") {
   inja::Environment env;
-  json data;
+  inja::json data;
   data["name"] = "Peter";
   data["city"] = "Brunswick";
   data["age"] = 29;
@@ -74,7 +74,7 @@
   }
 
   SUBCASE("nested loops") {
-    auto ldata = json::parse(R""""(
+    auto ldata = inja::json::parse(R""""(
 { "outer" : [
     { "inner" : [
         { "in2" : [ 1, 2 ] },
@@ -158,7 +158,7 @@
 }
 
 TEST_CASE("templates") {
-  json data;
+  inja::json data;
   data["name"] = "Peter";
   data["city"] = "Brunswick";
   data["is_happy"] = true;
@@ -186,8 +186,8 @@
   }
 
   SUBCASE("include-in-loop") {
-    json loop_data;
-    loop_data["cities"] = json::array({{{"name", "Munich"}}, {{"name", "New York"}}});
+    inja::json loop_data;
+    loop_data["cities"] = inja::json::array({{{"name", "Munich"}}, {{"name", "New York"}}});
 
     inja::Environment env;
     env.include_template("city.tpl", env.parse("{{ loop.index }}:{{ city.name }};"));
@@ -246,7 +246,7 @@
 }
 
 TEST_CASE("other syntax") {
-  json data;
+  inja::json data;
   data["name"] = "Peter";
   data["city"] = "Brunswick";
   data["age"] = 29;
diff --git a/test/test-units.cpp b/test/test-units.cpp
index 95862f2..2366dde 100644
--- a/test/test-units.cpp
+++ b/test/test-units.cpp
@@ -36,16 +36,16 @@
   env.include_template("tpl", t1);
   std::string test_tpl = "{% include \"tpl\" %}";
 
-  REQUIRE(env.render(test_tpl, json()) == "4");
+  REQUIRE(env.render(test_tpl, inja::json()) == "4");
 
   inja::Environment copy(env);
-  CHECK(copy.render(test_tpl, json()) == "4");
+  CHECK(copy.render(test_tpl, inja::json()) == "4");
 
   // overwrite template in source env
   inja::Template t2 = env.parse("{{ double(4) }}");
   env.include_template("tpl", t2);
-  REQUIRE(env.render(test_tpl, json()) == "8");
+  REQUIRE(env.render(test_tpl, inja::json()) == "8");
 
   // template is unchanged in copy
-  CHECK(copy.render(test_tpl, json()) == "4");
+  CHECK(copy.render(test_tpl, inja::json()) == "4");
 }
diff --git a/test/test.cpp b/test/test.cpp
index 50161be..7645ade 100644
--- a/test/test.cpp
+++ b/test/test.cpp
@@ -5,8 +5,6 @@
 #include "doctest/doctest.h"
 #include "inja/inja.hpp"
 
-using json = nlohmann::json;
-
 const std::string test_file_directory {"../test/data/"};
 
 #include "test-files.cpp"