Index: base/json/json_writer.cc |
diff --git a/base/json/json_writer.cc b/base/json/json_writer.cc |
index f457331165004ebcc91226d6fbf2e26965e402df..27300c0b6356f42392537f88d69a45d929b4c887 100644 |
--- a/base/json/json_writer.cc |
+++ b/base/json/json_writer.cc |
@@ -1,9 +1,11 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
#include "base/json/json_writer.h" |
+#include <cmath> |
+ |
#include "base/json/string_escape.h" |
#include "base/logging.h" |
#include "base/stringprintf.h" |
@@ -40,7 +42,10 @@ void JSONWriter::WriteWithOptions(const Value* const node, |
JSONWriter writer(pretty_print, json); |
bool escape = !(options & OPTIONS_DO_NOT_ESCAPE); |
bool omit_binary_values = !!(options & OPTIONS_OMIT_BINARY_VALUES); |
- writer.BuildJSONString(node, 0, escape, omit_binary_values); |
+ bool omit_double_type_preservation = |
+ !!(options & OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION); |
+ writer.BuildJSONString(node, 0, escape, omit_binary_values, |
+ omit_double_type_preservation); |
if (pretty_print) |
json->append(kPrettyPrintLineEnding); |
} |
@@ -54,7 +59,8 @@ JSONWriter::JSONWriter(bool pretty_print, std::string* json) |
void JSONWriter::BuildJSONString(const Value* const node, |
int depth, |
bool escape, |
- bool omit_binary_values) { |
+ bool omit_binary_values, |
+ bool omit_double_type_preservation) { |
switch (node->GetType()) { |
case Value::TYPE_NULL: |
json_string_->append("null"); |
@@ -83,6 +89,13 @@ void JSONWriter::BuildJSONString(const Value* const node, |
double value; |
bool result = node->GetAsDouble(&value); |
DCHECK(result); |
+ if (omit_double_type_preservation && |
+ value <= kint64max && |
+ value >= kint64min && |
+ std::floor(value) == value) { |
+ json_string_->append(Int64ToString(static_cast<int64>(value))); |
+ break; |
+ } |
std::string real = DoubleToString(value); |
// Ensure that the number has a .0 if there's no decimal or 'e'. This |
// makes sure that when we read the JSON back, it's interpreted as a |
@@ -139,7 +152,8 @@ void JSONWriter::BuildJSONString(const Value* const node, |
json_string_->append(" "); |
} |
- BuildJSONString(value, depth, escape, omit_binary_values); |
+ BuildJSONString(value, depth, escape, omit_binary_values, |
+ omit_double_type_preservation); |
} |
if (pretty_print_) |
@@ -181,7 +195,8 @@ void JSONWriter::BuildJSONString(const Value* const node, |
} else { |
json_string_->append(":"); |
} |
- BuildJSONString(value, depth + 1, escape, omit_binary_values); |
+ BuildJSONString(value, depth + 1, escape, omit_binary_values, |
+ omit_double_type_preservation); |
} |
if (pretty_print_) { |