begin support of actual serialization
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ca1b86f..7270899 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -269,7 +269,7 @@
     list(REMOVE_AT ARGV 0)
     add_executable(${name} ${ARGV})
     add_dependencies(everything ${name})
-    target_link_libraries(${name} libwabt)
+    target_link_libraries(${name} libwabt libjsoncpp)
     set_property(TARGET ${name} PROPERTY CXX_STANDARD 11)
     set_property(TARGET ${name} PROPERTY CXX_STANDARD_REQUIRED ON)
     list(APPEND WABT_EXECUTABLES ${name})
@@ -353,7 +353,7 @@
       third_party/gtest/googletest/src/gtest_main.cc
     )
     wabt_executable(wabt-unittests ${UNITTESTS_SRCS})
-    target_link_libraries(wabt-unittests libgtest ${CMAKE_THREAD_LIBS_INIT})
+    target_link_libraries(wabt-unittests libgtest libjsoncpp ${CMAKE_THREAD_LIBS_INIT})
   endif ()
 
   # test running
diff --git a/src/source-maps.cc b/src/source-maps.cc
index 84f5cb9..435dea3 100644
--- a/src/source-maps.cc
+++ b/src/source-maps.cc
@@ -19,6 +19,8 @@
 #include <cassert>
 #include <iostream>
 
+#include "json/json.h"
+
 #define INDEX_NONE static_cast<size_t>(-1)
 
 #define INVALID()       \
@@ -158,8 +160,17 @@
   std::vector<std::string> mapping_results;
   mapping_results.reserve(mappings.size());
   CompressMappings();
-  // TODO: serialize the mappings.
-  return "";
+  Json::Value output;
+  output["version"] = SourceMap::kSourceMapVersion;
+  output["file"] = map.file;
+  output["sourceRoot"] = map.source_root;
+  Json::Value sources(Json::arrayValue);
+  for (const auto& source : map.sources) {
+    sources.append(source);
+  }
+  output["sources"] = sources;
+  std::cout << output;
+  return output.toStyledString();
 }
 
 void SourceMapGenerator::DumpRawMappings() {
diff --git a/src/source-maps.h b/src/source-maps.h
index 5af89db..849cc73 100644
--- a/src/source-maps.h
+++ b/src/source-maps.h
@@ -92,7 +92,7 @@
     CompressMappings();
     return map;
   };
-
+  std::string SerializeMappings();
  public:
   // TODO: make this private? But need to find a way to use it in tests.
   struct SourceMapping {
@@ -108,7 +108,6 @@
  private:
   void CompressMappings();
 
-  std::string SerializeMappings();
   bool map_prepared = false;  // Is the map compressed and ready for export?
   SourceMap map;
   std::map<std::string, size_t> sources_map;
diff --git a/src/test-source-maps.cc b/src/test-source-maps.cc
index 7816577..5b6dcfb 100644
--- a/src/test-source-maps.cc
+++ b/src/test-source-maps.cc
@@ -215,3 +215,18 @@
   s = {{1, 1}, {true, 0}, {8, 0}, {0, 0}, {false, 0}};
   EXPECT_SEGMENT_EQ(s, map.segment_groups.back().segments.back());
 }
+
+#define EXPECT_JSON_CONTAINS_STR(output, key, value)       \
+  EXPECT_TRUE(output.find(std::string("\"") + key + "\" : \"" + value + "\"") != std::string::npos)
+#define EXPECT_JSON_CONTAINS_NUM(output, key, value)       \
+  EXPECT_TRUE(output.find(std::string("\"") + key + "\" : " + value) != std::string::npos)
+
+
+TEST(source_maps, serialization_empty) {
+  SourceMapGenerator smg("source.out", "source-root");
+  std::string output = smg.SerializeMappings();
+  EXPECT_JSON_CONTAINS_NUM(output, "version", "3");
+  EXPECT_JSON_CONTAINS_STR(output, "file", "source.out");
+  EXPECT_JSON_CONTAINS_STR(output, "sourceRoot", "source-root");
+  EXPECT_JSON_CONTAINS_NUM(output, "sources", "[]"); // TODO: fix this abuse of NUM
+}