Index: base/json_writer.cc |
=================================================================== |
--- base/json_writer.cc (revision 29830) |
+++ base/json_writer.cc (working copy) |
@@ -1,198 +0,0 @@ |
-// Copyright (c) 2009 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_writer.h" |
- |
-#include "base/logging.h" |
-#include "base/string_util.h" |
-#include "base/values.h" |
-#include "base/string_escape.h" |
-#include "base/utf_string_conversions.h" |
- |
-#if defined(OS_WIN) |
-static const char kPrettyPrintLineEnding[] = "\r\n"; |
-#else |
-static const char kPrettyPrintLineEnding[] = "\n"; |
-#endif |
- |
-/* static */ |
-void JSONWriter::Write(const Value* const node, |
- bool pretty_print, |
- std::string* json) { |
- WriteWithOptionalEscape(node, pretty_print, true, json); |
-} |
- |
-/* static */ |
-void JSONWriter::WriteWithOptionalEscape(const Value* const node, |
- bool pretty_print, |
- bool escape, |
- std::string* json) { |
- json->clear(); |
- // Is there a better way to estimate the size of the output? |
- json->reserve(1024); |
- JSONWriter writer(pretty_print, json); |
- writer.BuildJSONString(node, 0, escape); |
- if (pretty_print) |
- json->append(kPrettyPrintLineEnding); |
-} |
- |
-JSONWriter::JSONWriter(bool pretty_print, std::string* json) |
- : json_string_(json), |
- pretty_print_(pretty_print) { |
- DCHECK(json); |
-} |
- |
-void JSONWriter::BuildJSONString(const Value* const node, |
- int depth, |
- bool escape) { |
- switch(node->GetType()) { |
- case Value::TYPE_NULL: |
- json_string_->append("null"); |
- break; |
- |
- case Value::TYPE_BOOLEAN: |
- { |
- bool value; |
- bool result = node->GetAsBoolean(&value); |
- DCHECK(result); |
- json_string_->append(value ? "true" : "false"); |
- break; |
- } |
- |
- case Value::TYPE_INTEGER: |
- { |
- int value; |
- bool result = node->GetAsInteger(&value); |
- DCHECK(result); |
- StringAppendF(json_string_, "%d", value); |
- break; |
- } |
- |
- case Value::TYPE_REAL: |
- { |
- double value; |
- bool result = node->GetAsReal(&value); |
- DCHECK(result); |
- 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 |
- // real rather than an int. |
- if (real.find('.') == std::string::npos && |
- real.find('e') == std::string::npos && |
- real.find('E') == std::string::npos) { |
- real.append(".0"); |
- } |
- // The JSON spec requires that non-integer values in the range (-1,1) |
- // have a zero before the decimal point - ".52" is not valid, "0.52" is. |
- if (real[0] == '.') { |
- real.insert(0, "0"); |
- } else if (real.length() > 1 && real[0] == '-' && real[1] == '.') { |
- // "-.1" bad "-0.1" good |
- real.insert(1, "0"); |
- } |
- json_string_->append(real); |
- break; |
- } |
- |
- case Value::TYPE_STRING: |
- { |
- std::string value; |
- bool result = node->GetAsString(&value); |
- DCHECK(result); |
- if (escape) { |
- string_escape::JsonDoubleQuote(UTF8ToUTF16(value), |
- true, |
- json_string_); |
- } else { |
- string_escape::JsonDoubleQuote(value, true, json_string_); |
- } |
- break; |
- } |
- |
- case Value::TYPE_LIST: |
- { |
- json_string_->append("["); |
- if (pretty_print_) |
- json_string_->append(" "); |
- |
- const ListValue* list = static_cast<const ListValue*>(node); |
- for (size_t i = 0; i < list->GetSize(); ++i) { |
- if (i != 0) { |
- json_string_->append(","); |
- if (pretty_print_) |
- json_string_->append(" "); |
- } |
- |
- Value* value = NULL; |
- bool result = list->Get(i, &value); |
- DCHECK(result); |
- BuildJSONString(value, depth, escape); |
- } |
- |
- if (pretty_print_) |
- json_string_->append(" "); |
- json_string_->append("]"); |
- break; |
- } |
- |
- case Value::TYPE_DICTIONARY: |
- { |
- json_string_->append("{"); |
- if (pretty_print_) |
- json_string_->append(kPrettyPrintLineEnding); |
- |
- const DictionaryValue* dict = |
- static_cast<const DictionaryValue*>(node); |
- for (DictionaryValue::key_iterator key_itr = dict->begin_keys(); |
- key_itr != dict->end_keys(); |
- ++key_itr) { |
- |
- if (key_itr != dict->begin_keys()) { |
- json_string_->append(","); |
- if (pretty_print_) |
- json_string_->append(kPrettyPrintLineEnding); |
- } |
- |
- Value* value = NULL; |
- bool result = dict->Get(*key_itr, &value); |
- DCHECK(result); |
- |
- if (pretty_print_) |
- IndentLine(depth + 1); |
- AppendQuotedString(*key_itr); |
- if (pretty_print_) { |
- json_string_->append(": "); |
- } else { |
- json_string_->append(":"); |
- } |
- BuildJSONString(value, depth + 1, escape); |
- } |
- |
- if (pretty_print_) { |
- json_string_->append(kPrettyPrintLineEnding); |
- IndentLine(depth); |
- json_string_->append("}"); |
- } else { |
- json_string_->append("}"); |
- } |
- break; |
- } |
- |
- default: |
- // TODO(jhughes): handle TYPE_BINARY |
- NOTREACHED() << "unknown json type"; |
- } |
-} |
- |
-void JSONWriter::AppendQuotedString(const std::wstring& str) { |
- string_escape::JsonDoubleQuote(WideToUTF16Hack(str), |
- true, |
- json_string_); |
-} |
- |
-void JSONWriter::IndentLine(int depth) { |
- // It may be faster to keep an indent string so we don't have to keep |
- // reallocating. |
- json_string_->append(std::string(depth * 3, ' ')); |
-} |