diff --git a/td/telegram/JsonValue.cpp b/td/telegram/JsonValue.cpp index de64bd103..091577273 100644 --- a/td/telegram/JsonValue.cpp +++ b/td/telegram/JsonValue.cpp @@ -19,14 +19,6 @@ namespace td { -static td_api::object_ptr get_json_value_object(const JsonValue &json_value); - -static td_api::object_ptr get_json_value_member_object( - const std::pair &json_value_member) { - return td_api::make_object(json_value_member.first.str(), - get_json_value_object(json_value_member.second)); -} - static td_api::object_ptr get_json_value_object(const JsonValue &json_value) { switch (json_value.type()) { case JsonValue::Type::Null: @@ -39,9 +31,13 @@ static td_api::object_ptr get_json_value_object(const JsonVal return td_api::make_object(json_value.get_string().str()); case JsonValue::Type::Array: return td_api::make_object(transform(json_value.get_array(), get_json_value_object)); - case JsonValue::Type::Object: - return td_api::make_object( - transform(json_value.get_object().field_values_, get_json_value_member_object)); + case JsonValue::Type::Object: { + vector> members; + json_value.get_object().foreach([&members](Slice name, const JsonValue &value) { + members.push_back(td_api::make_object(name.str(), get_json_value_object(value))); + }); + return td_api::make_object(std::move(members)); + } default: UNREACHABLE(); return nullptr; diff --git a/tdutils/td/utils/JsonBuilder.cpp b/tdutils/td/utils/JsonBuilder.cpp index cdd3063fa..6b48dab21 100644 --- a/tdutils/td/utils/JsonBuilder.cpp +++ b/tdutils/td/utils/JsonBuilder.cpp @@ -763,6 +763,12 @@ Result JsonObject::get_required_string_field(Slice name) const { return Status::Error(400, PSLICE() << "Can't find field \"" << name << '"'); } +void JsonObject::foreach(const std::function &callback) const { + for (auto &field_value : field_values_) { + callback(field_value.first, field_value.second); + } +} + bool has_json_object_field(const JsonObject &object, Slice name) { for (auto &field_value : object.field_values_) { if (field_value.first == name) { diff --git a/tdutils/td/utils/JsonBuilder.h b/tdutils/td/utils/JsonBuilder.h index e177013f5..195d777fa 100644 --- a/tdutils/td/utils/JsonBuilder.h +++ b/tdutils/td/utils/JsonBuilder.h @@ -14,6 +14,7 @@ #include "td/utils/Status.h" #include "td/utils/StringBuilder.h" +#include #include #include #include @@ -492,6 +493,8 @@ class JsonObject { Result get_optional_string_field(Slice name, string default_value = string()) const; Result get_required_string_field(Slice name) const; + + void foreach(const std::function &callback) const; }; class JsonValue final : private Jsonable {