diff --git a/folly/json.cpp b/folly/json.cpp
index f248ef8e324a416af14a973b7636c1c6cfd80948..28fe5f11e992806f3949d6b42a32d26c66894b74 100644
--- a/folly/json.cpp
+++ b/folly/json.cpp
@@ -126,6 +126,11 @@ struct Printer {
   void operator()(dynamic const& v) const {
     switch (v.type()) {
     case dynamic::DOUBLE:
+      if (!opts_.allow_nan_inf &&
+          (isnan(v.asDouble()) || isinf(v.asDouble()))) {
+        throw std::runtime_error("folly::toJson: JSON object value was a "
+          "NaN or INF");
+      }
       toAppend(v.asDouble(), &out_);
       break;
     case dynamic::INT64: {
@@ -751,6 +756,7 @@ fbstring toPrettyJson(dynamic const& dyn) {
 void dynamic::print_as_pseudo_json(std::ostream& out) const {
   json::serialization_opts opts;
   opts.allow_non_string_keys = true;
+  opts.allow_nan_inf = true;
   out << json::serialize(*this, opts);
 }
 
diff --git a/folly/json.h b/folly/json.h
index 527eb235a765d2ba71a5ae509db835a8a2bed134..8b5ce55a2f4e26d6df87b9e9a485399a32decfa4 100644
--- a/folly/json.h
+++ b/folly/json.h
@@ -61,6 +61,7 @@ namespace json {
       , allow_trailing_comma(false)
       , sort_keys(false)
       , skip_invalid_utf8(false)
+      , allow_nan_inf(false)
     {}
 
     // If true, keys in an object can be non-strings.  (In strict
@@ -93,6 +94,9 @@ namespace json {
 
     // Replace invalid utf8 characters with U+FFFD and continue
     bool skip_invalid_utf8;
+
+    // true to allow NaN or INF values
+    bool allow_nan_inf;
   };
 
   /*