works with JSON_NO_IO
diff --git a/include/inja/environment.hpp b/include/inja/environment.hpp
index a652935..9aa52ee 100644
--- a/include/inja/environment.hpp
+++ b/include/inja/environment.hpp
@@ -165,9 +165,8 @@
     if (file.fail()) {
       INJA_THROW(FileError("failed accessing file at '" + input_path + filename + "'"));
     }
-    json j;
-    file >> j;
-    return j;
+
+    return json::parse(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
   }
 
   /*!
diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp
index f24bb91..8f813b9 100644
--- a/include/inja/renderer.hpp
+++ b/include/inja/renderer.hpp
@@ -458,7 +458,7 @@
         if (value.is_string()) {
           os << value.get<std::string>(); // otherwise the value is surrounded with ""
         } else {
-          os << value;
+          os << value.dump();
         }
         sep = separator;
       }
diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp
index 6aad870..3505ee8 100644
--- a/single_include/inja/inja.hpp
+++ b/single_include/inja/inja.hpp
@@ -2538,7 +2538,7 @@
         if (value.is_string()) {
           os << value.get<std::string>(); // otherwise the value is surrounded with ""
         } else {
-          os << value;
+          os << value.dump();
         }
         sep = separator;
       }
@@ -2867,9 +2867,8 @@
     if (file.fail()) {
       INJA_THROW(FileError("failed accessing file at '" + input_path + filename + "'"));
     }
-    json j;
-    file >> j;
-    return j;
+
+    return json::parse(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
   }
 
   /*!
diff --git a/test/test.cpp b/test/test.cpp
index 7645ade..5f5ed45 100644
--- a/test/test.cpp
+++ b/test/test.cpp
@@ -3,6 +3,8 @@
 #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
 
 #include "doctest/doctest.h"
+
+#define JSON_NO_IO 1
 #include "inja/inja.hpp"
 
 const std::string test_file_directory {"../test/data/"};