blob: 3ab5f754b72072ce9964b3c8eeb156cc27f6bae4 [file] [log] [blame]
Vitaly Bukacbed2062015-08-17 12:54:05 -07001// 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#include "base/values.h"
10
11namespace base {
12
13// Values 1000 and above are used by JSONFileValueSerializer::JsonFileError.
Alex Vakulenko674f0eb2016-01-20 08:10:48 -080014static_assert(JSONReader::JSON_PARSE_ERROR_COUNT < 1000,
15 "JSONReader error out of bounds");
Vitaly Bukacbed2062015-08-17 12:54:05 -070016
17const char JSONReader::kInvalidEscape[] =
18 "Invalid escape sequence.";
19const char JSONReader::kSyntaxError[] =
20 "Syntax error.";
21const char JSONReader::kUnexpectedToken[] =
22 "Unexpected token.";
23const char JSONReader::kTrailingComma[] =
24 "Trailing comma not allowed.";
25const char JSONReader::kTooMuchNesting[] =
26 "Too much nesting.";
27const char JSONReader::kUnexpectedDataAfterRoot[] =
28 "Unexpected data after root element.";
29const char JSONReader::kUnsupportedEncoding[] =
30 "Unsupported encoding. JSON must be UTF-8.";
31const char JSONReader::kUnquotedDictionaryKey[] =
32 "Dictionary keys must be quoted.";
33
34JSONReader::JSONReader()
35 : JSONReader(JSON_PARSE_RFC) {
36}
37
38JSONReader::JSONReader(int options)
39 : parser_(new internal::JSONParser(options)) {
40}
41
42JSONReader::~JSONReader() {
43}
44
45// static
Alex Vakulenko674f0eb2016-01-20 08:10:48 -080046scoped_ptr<Value> JSONReader::Read(const StringPiece& json) {
Vitaly Bukacbed2062015-08-17 12:54:05 -070047 internal::JSONParser parser(JSON_PARSE_RFC);
48 return make_scoped_ptr(parser.Parse(json));
49}
50
51// static
Alex Vakulenko674f0eb2016-01-20 08:10:48 -080052scoped_ptr<Value> JSONReader::Read(const StringPiece& json, int options) {
Vitaly Bukacbed2062015-08-17 12:54:05 -070053 internal::JSONParser parser(options);
54 return make_scoped_ptr(parser.Parse(json));
55}
56
Vitaly Bukacbed2062015-08-17 12:54:05 -070057
58// static
Alex Vakulenko674f0eb2016-01-20 08:10:48 -080059scoped_ptr<Value> JSONReader::ReadAndReturnError(const StringPiece& json,
Vitaly Bukacbed2062015-08-17 12:54:05 -070060 int options,
61 int* error_code_out,
Alex Vakulenko674f0eb2016-01-20 08:10:48 -080062 std::string* error_msg_out,
63 int* error_line_out,
64 int* error_column_out) {
Vitaly Bukacbed2062015-08-17 12:54:05 -070065 internal::JSONParser parser(options);
66 scoped_ptr<Value> root(parser.Parse(json));
67 if (!root) {
68 if (error_code_out)
69 *error_code_out = parser.error_code();
70 if (error_msg_out)
71 *error_msg_out = parser.GetErrorMessage();
Alex Vakulenko674f0eb2016-01-20 08:10:48 -080072 if (error_line_out)
73 *error_line_out = parser.error_line();
74 if (error_column_out)
75 *error_column_out = parser.error_column();
Vitaly Bukacbed2062015-08-17 12:54:05 -070076 }
77
78 return root;
79}
80
81// static
82std::string JSONReader::ErrorCodeToString(JsonParseError error_code) {
83 switch (error_code) {
84 case JSON_NO_ERROR:
85 return std::string();
86 case JSON_INVALID_ESCAPE:
87 return kInvalidEscape;
88 case JSON_SYNTAX_ERROR:
89 return kSyntaxError;
90 case JSON_UNEXPECTED_TOKEN:
91 return kUnexpectedToken;
92 case JSON_TRAILING_COMMA:
93 return kTrailingComma;
94 case JSON_TOO_MUCH_NESTING:
95 return kTooMuchNesting;
96 case JSON_UNEXPECTED_DATA_AFTER_ROOT:
97 return kUnexpectedDataAfterRoot;
98 case JSON_UNSUPPORTED_ENCODING:
99 return kUnsupportedEncoding;
100 case JSON_UNQUOTED_DICTIONARY_KEY:
101 return kUnquotedDictionaryKey;
102 default:
103 NOTREACHED();
104 return std::string();
105 }
106}
107
108scoped_ptr<Value> JSONReader::ReadToValue(const std::string& json) {
109 return make_scoped_ptr(parser_->Parse(json));
110}
111
112JSONReader::JsonParseError JSONReader::error_code() const {
113 return parser_->error_code();
114}
115
116std::string JSONReader::GetErrorMessage() const {
117 return parser_->GetErrorMessage();
118}
119
120} // namespace base