/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include namespace android { namespace jsonpb { using google::protobuf::DescriptorPool; using google::protobuf::Message; using google::protobuf::scoped_ptr; using google::protobuf::util::NewTypeResolverForDescriptorPool; using google::protobuf::util::TypeResolver; static constexpr char kTypeUrlPrefix[] = "type.googleapis.com"; std::string GetTypeUrl(const Message& message) { return std::string(kTypeUrlPrefix) + "/" + message.GetDescriptor()->full_name(); } ErrorOr MessageToJsonString(const Message& message) { scoped_ptr resolver( NewTypeResolverForDescriptorPool(kTypeUrlPrefix, DescriptorPool::generated_pool())); google::protobuf::util::JsonOptions options; options.add_whitespace = true; std::string json; auto status = BinaryToJsonString(resolver.get(), GetTypeUrl(message), message.SerializeAsString(), &json, options); if (!status.ok()) { return MakeError(status.error_message().as_string()); } return ErrorOr(std::move(json)); } namespace internal { ErrorOr JsonStringToMessage(const std::string& content, Message* message) { scoped_ptr resolver( NewTypeResolverForDescriptorPool(kTypeUrlPrefix, DescriptorPool::generated_pool())); std::string binary; auto status = JsonToBinaryString(resolver.get(), GetTypeUrl(*message), content, &binary); if (!status.ok()) { return MakeError(status.error_message().as_string()); } if (!message->ParseFromString(binary)) { return MakeError("Fail to parse."); } return ErrorOr(); } } // namespace internal } // namespace jsonpb } // namespace android