• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "base/json/json_reader.h"
6 
7 #include "base/json/json_parser.h"
8 #include "base/logging.h"
9 
10 namespace base {
11 
12 // Values 1000 and above are used by JSONFileValueSerializer::JsonFileError.
13 COMPILE_ASSERT(JSONReader::JSON_PARSE_ERROR_COUNT < 1000,
14                json_reader_error_out_of_bounds);
15 
16 const char* JSONReader::kInvalidEscape =
17     "Invalid escape sequence.";
18 const char* JSONReader::kSyntaxError =
19     "Syntax error.";
20 const char* JSONReader::kUnexpectedToken =
21     "Unexpected token.";
22 const char* JSONReader::kTrailingComma =
23     "Trailing comma not allowed.";
24 const char* JSONReader::kTooMuchNesting =
25     "Too much nesting.";
26 const char* JSONReader::kUnexpectedDataAfterRoot =
27     "Unexpected data after root element.";
28 const char* JSONReader::kUnsupportedEncoding =
29     "Unsupported encoding. JSON must be UTF-8.";
30 const char* JSONReader::kUnquotedDictionaryKey =
31     "Dictionary keys must be quoted.";
32 
JSONReader()33 JSONReader::JSONReader()
34     : parser_(new internal::JSONParser(JSON_PARSE_RFC)) {
35 }
36 
JSONReader(int options)37 JSONReader::JSONReader(int options)
38     : parser_(new internal::JSONParser(options)) {
39 }
40 
~JSONReader()41 JSONReader::~JSONReader() {
42 }
43 
44 // static
Read(const StringPiece & json)45 Value* JSONReader::Read(const StringPiece& json) {
46   internal::JSONParser parser(JSON_PARSE_RFC);
47   return parser.Parse(json);
48 }
49 
50 // static
Read(const StringPiece & json,int options)51 Value* JSONReader::Read(const StringPiece& json,
52                         int options) {
53   internal::JSONParser parser(options);
54   return parser.Parse(json);
55 }
56 
57 // static
ReadAndReturnError(const StringPiece & json,int options,int * error_code_out,std::string * error_msg_out)58 Value* JSONReader::ReadAndReturnError(const StringPiece& json,
59                                       int options,
60                                       int* error_code_out,
61                                       std::string* error_msg_out) {
62   internal::JSONParser parser(options);
63   Value* root = parser.Parse(json);
64   if (root)
65     return root;
66 
67   if (error_code_out)
68     *error_code_out = parser.error_code();
69   if (error_msg_out)
70     *error_msg_out = parser.GetErrorMessage();
71 
72   return NULL;
73 }
74 
75 // static
ErrorCodeToString(JsonParseError error_code)76 std::string JSONReader::ErrorCodeToString(JsonParseError error_code) {
77   switch (error_code) {
78     case JSON_NO_ERROR:
79       return std::string();
80     case JSON_INVALID_ESCAPE:
81       return kInvalidEscape;
82     case JSON_SYNTAX_ERROR:
83       return kSyntaxError;
84     case JSON_UNEXPECTED_TOKEN:
85       return kUnexpectedToken;
86     case JSON_TRAILING_COMMA:
87       return kTrailingComma;
88     case JSON_TOO_MUCH_NESTING:
89       return kTooMuchNesting;
90     case JSON_UNEXPECTED_DATA_AFTER_ROOT:
91       return kUnexpectedDataAfterRoot;
92     case JSON_UNSUPPORTED_ENCODING:
93       return kUnsupportedEncoding;
94     case JSON_UNQUOTED_DICTIONARY_KEY:
95       return kUnquotedDictionaryKey;
96     default:
97       NOTREACHED();
98       return std::string();
99   }
100 }
101 
ReadToValue(const std::string & json)102 Value* JSONReader::ReadToValue(const std::string& json) {
103   return parser_->Parse(json);
104 }
105 
error_code() const106 JSONReader::JsonParseError JSONReader::error_code() const {
107   return parser_->error_code();
108 }
109 
GetErrorMessage() const110 std::string JSONReader::GetErrorMessage() const {
111   return parser_->GetErrorMessage();
112 }
113 
114 }  // namespace base
115