ISerializer& JsonOutputStreamSerializer::operator()(int64_t& value, const std::string& name) {
  JsonValue* val = chain.back();
  JsonValue v;
  v = static_cast<int64_t>(value);
  if (val->isArray()) {
    val->pushBack(v);
  } else {
    val->insert(name, v);
  }
  return *this;
}
ISerializer& JsonOutputStreamSerializer::beginObject(const std::string& name) {
  if (chain.size() == 0) {
    chain.push_back(&root);
    return *this;
  }

  JsonValue* parent = chain.back();
  JsonValue obj(JsonValue::OBJECT);

  if (parent->isObject()) {
    JsonValue& res = parent->insert(name, obj);
    chain.push_back(&res);
  } else {
    JsonValue& res = parent->pushBack(obj);
    chain.push_back(&res);
  }

  return *this;
}