diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/json/yson/json2yson.cpp | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/json/yson/json2yson.cpp')
-rw-r--r-- | library/cpp/json/yson/json2yson.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/library/cpp/json/yson/json2yson.cpp b/library/cpp/json/yson/json2yson.cpp new file mode 100644 index 0000000000..f72cb7a9ef --- /dev/null +++ b/library/cpp/json/yson/json2yson.cpp @@ -0,0 +1,108 @@ +#include "json2yson.h" + +#include <library/cpp/yson/parser.h> +#include <library/cpp/yson/json/json_writer.h> +#include <library/cpp/yson/json/yson2json_adapter.h> + +namespace NJson2Yson { + static void WriteJsonValue(const NJson::TJsonValue& jsonValue, NYT::TYson2JsonCallbacksAdapter* adapter) { + switch (jsonValue.GetType()) { + default: + case NJson::JSON_NULL: + adapter->OnNull(); + break; + case NJson::JSON_BOOLEAN: + adapter->OnBoolean(jsonValue.GetBoolean()); + break; + case NJson::JSON_DOUBLE: + adapter->OnDouble(jsonValue.GetDouble()); + break; + case NJson::JSON_INTEGER: + adapter->OnInteger(jsonValue.GetInteger()); + break; + case NJson::JSON_UINTEGER: + adapter->OnUInteger(jsonValue.GetUInteger()); + break; + case NJson::JSON_STRING: + adapter->OnString(jsonValue.GetString()); + break; + case NJson::JSON_ARRAY: { + adapter->OnOpenArray(); + const NJson::TJsonValue::TArray& arr = jsonValue.GetArray(); + for (const auto& it : arr) + WriteJsonValue(it, adapter); + adapter->OnCloseArray(); + break; + } + case NJson::JSON_MAP: { + adapter->OnOpenMap(); + const NJson::TJsonValue::TMapType& map = jsonValue.GetMap(); + for (const auto& it : map) { + adapter->OnMapKey(it.first); + WriteJsonValue(it.second, adapter); + } + adapter->OnCloseMap(); + break; + } + } + } + + void SerializeJsonValueAsYson(const NJson::TJsonValue& inputValue, NYson::TYsonWriter* ysonWriter) { + NYT::TYson2JsonCallbacksAdapter adapter(ysonWriter); + WriteJsonValue(inputValue, &adapter); + } + + void SerializeJsonValueAsYson(const NJson::TJsonValue& inputValue, IOutputStream* outputStream) { + NYson::TYsonWriter ysonWriter(outputStream, NYson::EYsonFormat::Binary, ::NYson::EYsonType::Node, false); + SerializeJsonValueAsYson(inputValue, &ysonWriter); + } + + void SerializeJsonValueAsYson(const NJson::TJsonValue& inputValue, TString& result) { + TStringOutput resultStream(result); + SerializeJsonValueAsYson(inputValue, &resultStream); + } + + TString SerializeJsonValueAsYson(const NJson::TJsonValue& inputValue) { + TString result; + SerializeJsonValueAsYson(inputValue, result); + return result; + } + + bool DeserializeYsonAsJsonValue(IInputStream* inputStream, NJson::TJsonValue* outputValue, bool throwOnError) { + NJson::TParserCallbacks parser(*outputValue); + NJson2Yson::TJsonBuilder consumer(&parser); + NYson::TYsonParser ysonParser(&consumer, inputStream, ::NYson::EYsonType::Node); + try { + ysonParser.Parse(); + } catch (...) { + if (throwOnError) { + throw; + } + return false; + } + return true; + } + + bool DeserializeYsonAsJsonValue(TStringBuf str, NJson::TJsonValue* outputValue, bool throwOnError) { + TMemoryInput inputStream(str); + return DeserializeYsonAsJsonValue(&inputStream, outputValue, throwOnError); + } + + void ConvertYson2Json(IInputStream* inputStream, IOutputStream* outputStream) { + NYT::TJsonWriter writer(outputStream, ::NYson::EYsonType::Node, NYT::JF_TEXT, NYT::JAM_ON_DEMAND, NYT::SBF_BOOLEAN); + NYson::TYsonParser ysonParser(&writer, inputStream, ::NYson::EYsonType::Node); + ysonParser.Parse(); + } + + void ConvertYson2Json(TStringBuf yson, IOutputStream* outputStream) { + TMemoryInput inputStream(yson); + ConvertYson2Json(&inputStream, outputStream); + } + + TString ConvertYson2Json(TStringBuf yson) { + TString json; + TStringOutput outputStream(json); + ConvertYson2Json(yson, &outputStream); + return json; + } +} |