diff options
author | Daniil Cherednik <dcherednik@ydb.tech> | 2023-10-23 20:34:16 +0000 |
---|---|---|
committer | Daniil Cherednik <dcherednik@ydb.tech> | 2023-10-23 20:34:16 +0000 |
commit | e84c813452e9ed62415b2d17a117008fce909a3d (patch) | |
tree | 998632d6f08419de5b644940799f3be9408ab46b /library/cpp/protobuf/json/json2proto.cpp | |
parent | df6e99640a1489cde9b7cc5b58a3747c6ec28921 (diff) | |
download | ydb-stable-23-3.tar.gz |
Intermediate changesstable-23-3
x-stable-origin-commit: 8b96eef194d7fb3b315816b97322e8dd90bf3d94
Diffstat (limited to 'library/cpp/protobuf/json/json2proto.cpp')
-rw-r--r-- | library/cpp/protobuf/json/json2proto.cpp | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/library/cpp/protobuf/json/json2proto.cpp b/library/cpp/protobuf/json/json2proto.cpp index be8682e2398..bb6cc66de3e 100644 --- a/library/cpp/protobuf/json/json2proto.cpp +++ b/library/cpp/protobuf/json/json2proto.cpp @@ -258,6 +258,10 @@ Json2SingleField(const NJson::TJsonValue& json, const NJson::TJsonValue& fieldJson = name ? json[name] : json; + if (name && config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnEnterMapItem(name); + } + switch (field.cpp_type()) { JSON_TO_FIELD(CPPTYPE_INT32, field.name(), fieldJson, IsInteger, SetInt32, GetInteger); JSON_TO_FIELD(CPPTYPE_INT64, field.name(), fieldJson, IsInteger, SetInt64, GetInteger); @@ -295,6 +299,10 @@ Json2SingleField(const NJson::TJsonValue& json, ythrow yexception() << "Unknown protobuf field type: " << static_cast<int>(field.cpp_type()) << "."; } + + if (name && config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnLeaveMapItem(); + } } static void @@ -397,6 +405,10 @@ Json2RepeatedField(const NJson::TJsonValue& json, if (fieldJson.GetType() == NJson::JSON_UNDEFINED || fieldJson.GetType() == NJson::JSON_NULL) return; + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnEnterMapItem(name); + } + bool isMap = fieldJson.GetType() == NJson::JSON_MAP; if (isMap) { if (!config.MapAsObject) { @@ -421,7 +433,13 @@ Json2RepeatedField(const NJson::TJsonValue& json, for (const auto& x : jsonMap) { const TString& key = x.first; const NJson::TJsonValue& jsonValue = x.second; + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnEnterMapItem(key); + } Json2RepeatedFieldValue(jsonValue, proto, field, config, reflection, key); + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnLeaveMapItem(); + } } } else { if (config.ReplaceRepeatedFields) { @@ -429,17 +447,37 @@ Json2RepeatedField(const NJson::TJsonValue& json, } if (fieldJson.GetType() == NJson::JSON_ARRAY) { const NJson::TJsonValue::TArray& jsonArray = fieldJson.GetArray(); + ui64 id = 0; for (const NJson::TJsonValue& jsonValue : jsonArray) { + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnEnterArrayItem(id); + } Json2RepeatedFieldValue(jsonValue, proto, field, config, reflection); + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnLeaveArrayItem(); + } + ++id; } } else if (config.ValueVectorizer) { + ui64 id = 0; for (const NJson::TJsonValue& jsonValue : config.ValueVectorizer(fieldJson)) { + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnEnterArrayItem(id); + } Json2RepeatedFieldValue(jsonValue, proto, field, config, reflection); + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnLeaveArrayItem(); + } + ++id; } } else if (config.VectorizeScalars) { Json2RepeatedFieldValue(fieldJson, proto, field, config, reflection); } } + + if (config.UnknownFieldsCollector) { + config.UnknownFieldsCollector->OnLeaveMapItem(); + } } namespace NProtobufJson { @@ -463,14 +501,18 @@ namespace NProtobufJson { } } - if (!config.AllowUnknownFields) { + if (!config.AllowUnknownFields || config.UnknownFieldsCollector) { THashMap<TString, bool> knownFields; for (int f = 0, endF = descriptor->field_count(); f < endF; ++f) { const google::protobuf::FieldDescriptor* field = descriptor->field(f); knownFields[GetFieldName(*field, config)] = 1; } for (const auto& f : json.GetMap()) { - Y_ENSURE(knownFields.contains(f.first), "unknown field \"" << f.first << "\" for \"" << descriptor->full_name() << "\""); + const bool isFieldKnown = knownFields.contains(f.first); + Y_ENSURE(config.AllowUnknownFields || isFieldKnown, "unknown field \"" << f.first << "\" for \"" << descriptor->full_name() << "\""); + if (!isFieldKnown) { + config.UnknownFieldsCollector->OnUnknownField(f.first, *descriptor); + } } } } |