diff --git a/ydb/core/formats/arrow/accessor/sub_columns/json_extractors.cpp b/ydb/core/formats/arrow/accessor/sub_columns/json_extractors.cpp index d4b883a04827..e89217a46c15 100644 --- a/ydb/core/formats/arrow/accessor/sub_columns/json_extractors.cpp +++ b/ydb/core/formats/arrow/accessor/sub_columns/json_extractors.cpp @@ -39,33 +39,14 @@ TConclusionStatus TKVExtractor::DoFill(TDataBuilder& dataBuilder, std::deque>& iterators, const TStringBuf key, NBinaryJson::TEntryCursor& value) const { + std::deque>& iterators, const TStringBuf key, const NBinaryJson::TEntryCursor& value) const { std::variant res; bool addRes = true; - if (value.GetType() == NBinaryJson::EEntryType::String) { - NJson::TJsonValue jsonValue(value.GetString()); - NJsonWriter::TBuf sout; - sout.WriteJsonValue(&jsonValue); - res = NBinaryJson::SerializeToBinaryJson(sout.Str(), false); - } else if (value.GetType() == NBinaryJson::EEntryType::Number) { - const double val = value.GetNumber(); - double integer; - if (modf(val, &integer)) { - res = NBinaryJson::SerializeToBinaryJson(std::to_string(val), false); - } else { - res = NBinaryJson::SerializeToBinaryJson(std::to_string((i64)integer), false); - } - } else if (value.GetType() == NBinaryJson::EEntryType::BoolFalse) { - static const TString falseString = "false"; - res = NBinaryJson::SerializeToBinaryJson(falseString, false); - } else if (value.GetType() == NBinaryJson::EEntryType::BoolTrue) { - static const TString trueString = "true"; - res = NBinaryJson::SerializeToBinaryJson(trueString, false); - } else if (value.GetType() == NBinaryJson::EEntryType::Container) { + if (value.GetType() == NBinaryJson::EEntryType::Container) { auto container = value.GetContainer(); if (FirstLevelOnly || container.GetType() == NBinaryJson::EContainerType::Array) { - res = NBinaryJson::SerializeToBinaryJson(NBinaryJson::SerializeToJson(container), false); + res = NBinaryJson::SerializeToBinaryJson(value); // TODO: add support for arrays if needed // } else if (container.GetType() == NBinaryJson::EContainerType::Array) { // iterators.emplace_back(std::make_unique(container.GetArrayIterator(), key)); @@ -76,12 +57,8 @@ TConclusionStatus IJsonObjectExtractor::AddDataToBuilder(TDataBuilder& dataBuild } else { return TConclusionStatus::Fail("unexpected top value scalar in container iterator"); } - - } else if (value.GetType() == NBinaryJson::EEntryType::Null) { - static const TString nullString = "null"; - res = NBinaryJson::SerializeToBinaryJson(nullString, false); } else { - return TConclusionStatus::Fail("unexpected json value type: " + ::ToString((int)value.GetType())); + res = NBinaryJson::SerializeToBinaryJson(value); } if (addRes) { diff --git a/ydb/core/formats/arrow/accessor/sub_columns/json_extractors.h b/ydb/core/formats/arrow/accessor/sub_columns/json_extractors.h index 048288cb0988..3a035eb53a38 100644 --- a/ydb/core/formats/arrow/accessor/sub_columns/json_extractors.h +++ b/ydb/core/formats/arrow/accessor/sub_columns/json_extractors.h @@ -24,7 +24,7 @@ class IJsonObjectExtractor { } [[nodiscard]] TConclusionStatus AddDataToBuilder(TDataBuilder& dataBuilder, std::deque>& iterators, - const TStringBuf key, NBinaryJson::TEntryCursor& value) const; + const TStringBuf key, const NBinaryJson::TEntryCursor& value) const; public: virtual ~IJsonObjectExtractor() = default;