diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index c16f6eef..ff679d77 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -1315,24 +1315,28 @@ class basic_json
             {
                 return "null";
             }
+
             case (value_t::object):
             {
                 return "object";
             }
+
             case (value_t::array):
             {
                 return "array";
             }
+
             case (value_t::string):
             {
                 return "string";
             }
+
             case (value_t::boolean):
             {
                 return "boolean";
             }
-            case (value_t::number_integer):
-            case (value_t::number_float):
+
+            default:
             {
                 return "number";
             }
diff --git a/test/unit.cpp b/test/unit.cpp
index 352c05ae..e61f3bb9 100644
--- a/test/unit.cpp
+++ b/test/unit.cpp
@@ -3821,3 +3821,50 @@ TEST_CASE("lexicographical comparison operators")
         }
     }
 }
+
+TEST_CASE("serialization")
+{
+    SECTION("operator<<")
+    {
+        std::stringstream ss;
+        json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
+        ss << j;
+        CHECK(ss.str() == "[\"foo\",1,2,3,false,{\"one\":1}]");
+    }
+
+    SECTION("operator>>")
+    {
+        std::stringstream ss;
+        json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
+        j >> ss;
+        CHECK(ss.str() == "[\"foo\",1,2,3,false,{\"one\":1}]");
+    }
+}
+
+TEST_CASE("deserialization")
+{
+    SECTION("string")
+    {
+        auto s = "[\"foo\",1,2,3,false,{\"one\":1}]";
+        json j = json::parse(s);
+        CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}}));
+    }
+
+    SECTION("operator<<")
+    {
+        std::stringstream ss;
+        ss << "[\"foo\",1,2,3,false,{\"one\":1}]";
+        json j;
+        j << ss;
+        CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}}));
+    }
+
+    SECTION("operator>>")
+    {
+        std::stringstream ss;
+        ss << "[\"foo\",1,2,3,false,{\"one\":1}]";
+        json j;
+        ss >> j;
+        CHECK(j == json({"foo", 1, 2, 3, false, {{"one", 1}}}));
+    }
+}