147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/json.h"
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <errno.h>
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <limits.h>
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <stdlib.h>
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <sstream>
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetStringFromJson(const Json::Value& in, std::string* out) {
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!in.isString()) {
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    std::ostringstream s;
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (in.isBool()) {
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      s << std::boolalpha << in.asBool();
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    } else if (in.isInt()) {
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      s << in.asInt();
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    } else if (in.isUInt()) {
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      s << in.asUInt();
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    } else if (in.isDouble()) {
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      s << in.asDouble();
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    } else {
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      return false;
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    *out = s.str();
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  } else {
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    *out = in.asString();
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return true;
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetIntFromJson(const Json::Value& in, int* out) {
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool ret;
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!in.isString()) {
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ret = in.isConvertibleTo(Json::intValue);
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (ret) {
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      *out = in.asInt();
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  } else {
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    long val;  // NOLINT
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    const char* c_str = in.asCString();
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    char* end_ptr;
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    errno = 0;
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    val = strtol(c_str, &end_ptr, 10);  // NOLINT
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ret = (end_ptr != c_str && *end_ptr == '\0' && !errno &&
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org           val >= INT_MIN && val <= INT_MAX);
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    *out = val;
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return ret;
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetUIntFromJson(const Json::Value& in, unsigned int* out) {
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool ret;
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!in.isString()) {
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ret = in.isConvertibleTo(Json::uintValue);
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (ret) {
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      *out = in.asUInt();
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  } else {
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    unsigned long val;  // NOLINT
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    const char* c_str = in.asCString();
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    char* end_ptr;
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    errno = 0;
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    val = strtoul(c_str, &end_ptr, 10);  // NOLINT
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ret = (end_ptr != c_str && *end_ptr == '\0' && !errno &&
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org           val <= UINT_MAX);
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    *out = val;
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return ret;
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetBoolFromJson(const Json::Value& in, bool* out) {
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool ret;
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!in.isString()) {
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ret = in.isConvertibleTo(Json::booleanValue);
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (ret) {
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      *out = in.asBool();
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  } else {
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (in.asString() == "true") {
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      *out = true;
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      ret = true;
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    } else if (in.asString() == "false") {
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      *out = false;
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      ret = true;
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    } else {
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      ret = false;
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return ret;
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetDoubleFromJson(const Json::Value& in, double* out) {
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool ret;
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!in.isString()) {
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ret = in.isConvertibleTo(Json::realValue);
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (ret) {
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      *out = in.asDouble();
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  } else {
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    double val;
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    const char* c_str = in.asCString();
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    char* end_ptr;
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    errno = 0;
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    val = strtod(c_str, &end_ptr);
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ret = (end_ptr != c_str && *end_ptr == '\0' && !errno);
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    *out = val;
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return ret;
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace {
12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtemplate<typename T>
12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool JsonArrayToVector(const Json::Value& value,
12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       bool (*getter)(const Json::Value& in, T* out),
12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       std::vector<T> *vec) {
12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  vec->clear();
12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!value.isArray()) {
12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return false;
12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (Json::Value::ArrayIndex i = 0; i < value.size(); ++i) {
13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    T val;
13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (!getter(value[i], &val)) {
13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      return false;
13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    vec->push_back(val);
13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return true;
13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Trivial getter helper
14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetValueFromJson(const Json::Value& in, Json::Value* out) {
14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  *out = in;
14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return true;
14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // unnamed namespace
14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool JsonArrayToValueVector(const Json::Value& in,
14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                            std::vector<Json::Value>* out) {
14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return JsonArrayToVector(in, GetValueFromJson, out);
15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool JsonArrayToIntVector(const Json::Value& in,
15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          std::vector<int>* out) {
15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return JsonArrayToVector(in, GetIntFromJson, out);
15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool JsonArrayToUIntVector(const Json::Value& in,
15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                           std::vector<unsigned int>* out) {
15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return JsonArrayToVector(in, GetUIntFromJson, out);
16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool JsonArrayToStringVector(const Json::Value& in,
16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                             std::vector<std::string>* out) {
16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return JsonArrayToVector(in, GetStringFromJson, out);
16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool JsonArrayToBoolVector(const Json::Value& in,
16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                           std::vector<bool>* out) {
16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return JsonArrayToVector(in, GetBoolFromJson, out);
17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool JsonArrayToDoubleVector(const Json::Value& in,
17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                             std::vector<double>* out) {
17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return JsonArrayToVector(in, GetDoubleFromJson, out);
17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace {
17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtemplate<typename T>
17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgJson::Value VectorToJsonArray(const std::vector<T>& vec) {
18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value result(Json::arrayValue);
18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (size_t i = 0; i < vec.size(); ++i) {
18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    result.append(Json::Value(vec[i]));
18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return result;
18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // unnamed namespace
18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgJson::Value ValueVectorToJsonArray(const std::vector<Json::Value>& in) {
18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return VectorToJsonArray(in);
19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgJson::Value IntVectorToJsonArray(const std::vector<int>& in) {
19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return VectorToJsonArray(in);
19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgJson::Value UIntVectorToJsonArray(const std::vector<unsigned int>& in) {
19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return VectorToJsonArray(in);
19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgJson::Value StringVectorToJsonArray(const std::vector<std::string>& in) {
20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return VectorToJsonArray(in);
20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgJson::Value BoolVectorToJsonArray(const std::vector<bool>& in) {
20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return VectorToJsonArray(in);
20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgJson::Value DoubleVectorToJsonArray(const std::vector<double>& in) {
20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return VectorToJsonArray(in);
21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetValueFromJsonArray(const Json::Value& in, size_t n,
21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                           Json::Value* out) {
21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!in.isArray() || !in.isValidIndex(static_cast<int>(n))) {
21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return false;
21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  *out = in[static_cast<Json::Value::ArrayIndex>(n)];
21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return true;
22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetIntFromJsonArray(const Json::Value& in, size_t n,
22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                         int* out) {
22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value x;
22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetValueFromJsonArray(in, n, &x) && GetIntFromJson(x, out);
22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetUIntFromJsonArray(const Json::Value& in, size_t n,
22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          unsigned int* out)  {
23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value x;
23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetValueFromJsonArray(in, n, &x) && GetUIntFromJson(x, out);
23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetStringFromJsonArray(const Json::Value& in, size_t n,
23547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                            std::string* out) {
23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value x;
23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetValueFromJsonArray(in, n, &x) && GetStringFromJson(x, out);
23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetBoolFromJsonArray(const Json::Value& in, size_t n,
24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          bool* out) {
24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value x;
24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetValueFromJsonArray(in, n, &x) && GetBoolFromJson(x, out);
24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
24547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
24647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetDoubleFromJsonArray(const Json::Value& in, size_t n,
24747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                            double* out) {
24847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value x;
24947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetValueFromJsonArray(in, n, &x) && GetDoubleFromJson(x, out);
25047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
25147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
25247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetValueFromJsonObject(const Json::Value& in, const std::string& k,
25347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                            Json::Value* out) {
25447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!in.isObject() || !in.isMember(k)) {
25547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return false;
25647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
25747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
25847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  *out = in[k];
25947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return true;
26047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
26147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
26247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetIntFromJsonObject(const Json::Value& in, const std::string& k,
26347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          int* out) {
26447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value x;
26547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetValueFromJsonObject(in, k, &x) && GetIntFromJson(x, out);
26647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
26747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
26847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetUIntFromJsonObject(const Json::Value& in, const std::string& k,
26947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                           unsigned int* out)  {
27047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value x;
27147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetValueFromJsonObject(in, k, &x) && GetUIntFromJson(x, out);
27247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
27347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
27447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetStringFromJsonObject(const Json::Value& in, const std::string& k,
27547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                             std::string* out)  {
27647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value x;
27747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetValueFromJsonObject(in, k, &x) && GetStringFromJson(x, out);
27847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
27947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
28047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetBoolFromJsonObject(const Json::Value& in, const std::string& k,
28147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                           bool* out) {
28247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value x;
28347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetValueFromJsonObject(in, k, &x) && GetBoolFromJson(x, out);
28447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
28547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
28647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool GetDoubleFromJsonObject(const Json::Value& in, const std::string& k,
28747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                             double* out) {
28847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::Value x;
28947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetValueFromJsonObject(in, k, &x) && GetDoubleFromJson(x, out);
29047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
29147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
29247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstd::string JsonValueToString(const Json::Value& json) {
29347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Json::FastWriter w;
29447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  std::string value = w.write(json);
29547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return value.substr(0, value.size() - 1);  // trim trailing newline
29647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
297