1c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// Copyright (C) 2013 Google Inc.
2c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org//
3c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// Licensed under the Apache License, Version 2.0 (the "License");
4c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// you may not use this file except in compliance with the License.
5c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// You may obtain a copy of the License at
6c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org//
7c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// http://www.apache.org/licenses/LICENSE-2.0
8c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org//
9c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// Unless required by applicable law or agreed to in writing, software
10c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// distributed under the License is distributed on an "AS IS" BASIS,
11c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// See the License for the specific language governing permissions and
13c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// limitations under the License.
14c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
15c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org#ifndef I18N_ADDRESSINPUT_UTIL_JSON_H_
16c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org#define I18N_ADDRESSINPUT_UTIL_JSON_H_
17c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
18c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org#include <libaddressinput/util/basictypes.h>
19c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org#include <libaddressinput/util/scoped_ptr.h>
20c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
21c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org#include <string>
227825966d9566c8ced01471f1e6e6bf1e715f6572rouslan@chromium.org#include <vector>
23c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
24c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.orgnamespace i18n {
25c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.orgnamespace addressinput {
26c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
27c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org// Parses a JSON dictionary of strings. Sample usage:
28c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org//    Json json;
29c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org//    if (json.ParseObject("{'key1':'value1', 'key2':'value2'}") &&
30c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org//        json.HasStringKey("key1")) {
31c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org//      Process(json.GetStringValueForKey("key1"));
32c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org//    }
33c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.orgclass Json {
34c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org public:
35c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org  Json();
36c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org  ~Json();
37c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
38c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org  // Parses the |json| string and returns true if |json| is valid and it is an
39c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org  // object.
40c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org  bool ParseObject(const std::string& json);
41c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
420ddcd24a82f60578ab843feae5bea5545989cb96rouslan@chromium.org  // Returns the list of sub dictionaries. The JSON object must be parsed
430ddcd24a82f60578ab843feae5bea5545989cb96rouslan@chromium.org  // successfully in ParseObject() before invoking this method. The caller does
440ddcd24a82f60578ab843feae5bea5545989cb96rouslan@chromium.org  // not own the result.
450ddcd24a82f60578ab843feae5bea5545989cb96rouslan@chromium.org  const std::vector<const Json*>& GetSubDictionaries() const;
467825966d9566c8ced01471f1e6e6bf1e715f6572rouslan@chromium.org
47f924b7dfea039ad262f25c2d19fb9bd4905b96e8rouslan@chromium.org  // Returns true if the parsed JSON contains a string value for |key|. Sets
48f924b7dfea039ad262f25c2d19fb9bd4905b96e8rouslan@chromium.org  // |value| to the string value of the |key|. The JSON object must be parsed
49f924b7dfea039ad262f25c2d19fb9bd4905b96e8rouslan@chromium.org  // successfully in ParseObject() before invoking this method. The |value|
50f924b7dfea039ad262f25c2d19fb9bd4905b96e8rouslan@chromium.org  // parameter should not be NULL.
51f924b7dfea039ad262f25c2d19fb9bd4905b96e8rouslan@chromium.org  bool GetStringValueForKey(const std::string& key, std::string* value) const;
52c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
53c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org private:
54348b3a8d3d70b6109e4692d52f405ead7f6568b8rouslan@chromium.org  class JsonImpl;
55c221e308b9aed6571526a92c98e163709a5d93d4roubert@google.com  friend class JsonImpl;
56c221e308b9aed6571526a92c98e163709a5d93d4roubert@google.com
57c221e308b9aed6571526a92c98e163709a5d93d4roubert@google.com  // Constructor to be called by JsonImpl.
58c221e308b9aed6571526a92c98e163709a5d93d4roubert@google.com  explicit Json(JsonImpl* impl);
59c221e308b9aed6571526a92c98e163709a5d93d4roubert@google.com
60348b3a8d3d70b6109e4692d52f405ead7f6568b8rouslan@chromium.org  scoped_ptr<JsonImpl> impl_;
61c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
62c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org  DISALLOW_COPY_AND_ASSIGN(Json);
63c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org};
64c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
65c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org}  // namespace addressinput
66c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org}  // namespace i18n
67c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org
68c49156d6c80a08cc55ed968e4ab3a616409e72bcrouslan@chromium.org#endif  // I18N_ADDRESSINPUT_UTIL_JSON_H_
69