Home | History | Annotate | Download | only in json
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef BASE_JSON_JSON_WRITER_H_
      6 #define BASE_JSON_JSON_WRITER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/base_export.h"
     11 #include "base/basictypes.h"
     12 
     13 namespace base {
     14 
     15 class Value;
     16 
     17 class BASE_EXPORT JSONWriter {
     18  public:
     19   enum Options {
     20     // Do not escape the string, preserving its UTF8 characters. It is useful
     21     // if you can pass the resulting string to the JSON parser in binary form
     22     // (as UTF8).
     23     OPTIONS_DO_NOT_ESCAPE = 1 << 0,
     24 
     25     // For values of binary type, the value (and key if within a dictionary)
     26     // will be omitted from the output.
     27     OPTIONS_OMIT_BINARY_VALUES = 1 << 1,
     28 
     29     // This option instructs the writer to write doubles that have no fractional
     30     // part as a normal integer (i.e., without using exponential notation
     31     // or appending a '.0') as long as the value is within the range of a
     32     // 64-bit int.
     33     OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION = 1 << 2,
     34 
     35     // Return a slightly nicer formatted json string (pads with whitespace to
     36     // help with readability).
     37     OPTIONS_PRETTY_PRINT = 1 << 3
     38   };
     39 
     40   // Given a root node, generates a JSON string and puts it into |json|.
     41   // TODO(tc): Should we generate json if it would be invalid json (e.g.,
     42   // |node| is not a DictionaryValue/ListValue or if there are inf/-inf float
     43   // values)?
     44   static void Write(const Value* const node, std::string* json);
     45 
     46   // Same as above but with |options| which is a bunch of JSONWriter::Options
     47   // bitwise ORed together.
     48   static void WriteWithOptions(const Value* const node, int options,
     49                                std::string* json);
     50 
     51   // A static, constant JSON string representing an empty array.  Useful
     52   // for empty JSON argument passing.
     53   static const char* kEmptyArray;
     54 
     55  private:
     56   JSONWriter(bool escape, bool omit_binary_values,
     57              bool omit_double_type_preservation, bool pretty_print,
     58              std::string* json);
     59 
     60   // Called recursively to build the JSON string.  Whe completed, value is
     61   // json_string_ will contain the JSON.
     62   void BuildJSONString(const Value* const node, int depth);
     63 
     64   // Appends a quoted, escaped, version of (UTF-8) str to json_string_.
     65   void AppendQuotedString(const std::string& str);
     66 
     67   // Adds space to json_string_ for the indent level.
     68   void IndentLine(int depth);
     69 
     70   bool escape_;
     71   bool omit_binary_values_;
     72   bool omit_double_type_preservation_;
     73   bool pretty_print_;
     74 
     75   // Where we write JSON data as we generate it.
     76   std::string* json_string_;
     77 
     78   DISALLOW_COPY_AND_ASSIGN(JSONWriter);
     79 };
     80 
     81 }  // namespace base
     82 
     83 #endif  // BASE_JSON_JSON_WRITER_H_
     84