aboutsummaryrefslogtreecommitdiff
path: root/src/google/protobuf/util/json_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/google/protobuf/util/json_util.cc')
-rw-r--r--src/google/protobuf/util/json_util.cc60
1 files changed, 42 insertions, 18 deletions
diff --git a/src/google/protobuf/util/json_util.cc b/src/google/protobuf/util/json_util.cc
index f81a7a30..19e20a47 100644
--- a/src/google/protobuf/util/json_util.cc
+++ b/src/google/protobuf/util/json_util.cc
@@ -33,6 +33,7 @@
#include <google/protobuf/stubs/common.h>
#include <google/protobuf/io/coded_stream.h>
#include <google/protobuf/io/zero_copy_stream.h>
+#include <google/protobuf/stubs/once.h>
#include <google/protobuf/util/internal/default_value_objectwriter.h>
#include <google/protobuf/util/internal/error_listener.h>
#include <google/protobuf/util/internal/json_objectwriter.h>
@@ -42,8 +43,12 @@
#include <google/protobuf/util/type_resolver.h>
#include <google/protobuf/util/type_resolver_util.h>
#include <google/protobuf/stubs/bytestream.h>
+
+
#include <google/protobuf/stubs/status_macros.h>
+#include <google/protobuf/port_def.inc>
+
namespace google {
namespace protobuf {
namespace util {
@@ -120,34 +125,50 @@ namespace {
class StatusErrorListener : public converter::ErrorListener {
public:
StatusErrorListener() {}
- virtual ~StatusErrorListener() {}
+ ~StatusErrorListener() override {}
util::Status GetStatus() { return status_; }
virtual void InvalidName(const converter::LocationTrackerInterface& loc,
- StringPiece unknown_name, StringPiece message) {
- status_ = util::Status(util::error::INVALID_ARGUMENT,
- loc.ToString() + ": " + string(message));
+ StringPiece unknown_name,
+ StringPiece message) {
+ string loc_string = GetLocString(loc);
+ if (!loc_string.empty()) {
+ loc_string.append(" ");
+ }
+ status_ =
+ util::Status(util::error::INVALID_ARGUMENT,
+ StrCat(loc_string, unknown_name, ": ", message));
}
virtual void InvalidValue(const converter::LocationTrackerInterface& loc,
- StringPiece type_name, StringPiece value) {
- status_ =
- util::Status(util::error::INVALID_ARGUMENT,
- loc.ToString() + ": invalid value " + string(value) +
- " for type " + string(type_name));
+ StringPiece type_name,
+ StringPiece value) {
+ status_ = util::Status(
+ util::error::INVALID_ARGUMENT,
+ StrCat(GetLocString(loc), ": invalid value ", string(value),
+ " for type ", string(type_name)));
}
virtual void MissingField(const converter::LocationTrackerInterface& loc,
StringPiece missing_name) {
- status_ = util::Status(
- util::error::INVALID_ARGUMENT,
- loc.ToString() + ": missing field " + string(missing_name));
+ status_ = util::Status(util::error::INVALID_ARGUMENT,
+ StrCat(GetLocString(loc), ": missing field ",
+ string(missing_name)));
}
private:
util::Status status_;
+ string GetLocString(const converter::LocationTrackerInterface& loc) {
+ string loc_string = loc.ToString();
+ StripWhitespace(&loc_string);
+ if (!loc_string.empty()) {
+ loc_string = StrCat("(", loc_string, ")");
+ }
+ return loc_string;
+ }
+
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StatusErrorListener);
};
} // namespace
@@ -163,6 +184,8 @@ util::Status JsonToBinaryStream(TypeResolver* resolver,
StatusErrorListener listener;
converter::ProtoStreamObjectWriter::Options proto_writer_options;
proto_writer_options.ignore_unknown_fields = options.ignore_unknown_fields;
+ proto_writer_options.ignore_unknown_enum_values =
+ options.ignore_unknown_fields;
converter::ProtoStreamObjectWriter proto_writer(resolver, type, &sink,
&listener,
proto_writer_options);
@@ -172,8 +195,8 @@ util::Status JsonToBinaryStream(TypeResolver* resolver,
int length;
while (json_input->Next(&buffer, &length)) {
if (length == 0) continue;
- RETURN_IF_ERROR(
- parser.Parse(StringPiece(static_cast<const char*>(buffer), length)));
+ RETURN_IF_ERROR(parser.Parse(
+ StringPiece(static_cast<const char*>(buffer), length)));
}
RETURN_IF_ERROR(parser.FinishParse());
@@ -182,7 +205,7 @@ util::Status JsonToBinaryStream(TypeResolver* resolver,
util::Status JsonToBinaryString(TypeResolver* resolver,
const string& type_url,
- const string& json_input,
+ StringPiece json_input,
string* binary_output,
const JsonParseOptions& options) {
io::ArrayInputStream input_stream(json_input.data(), json_input.size());
@@ -194,7 +217,7 @@ util::Status JsonToBinaryString(TypeResolver* resolver,
namespace {
const char* kTypeUrlPrefix = "type.googleapis.com";
TypeResolver* generated_type_resolver_ = NULL;
-GOOGLE_PROTOBUF_DECLARE_ONCE(generated_type_resolver_init_);
+PROTOBUF_NAMESPACE_ID::internal::once_flag generated_type_resolver_init_;
string GetTypeUrl(const Message& message) {
return string(kTypeUrlPrefix) + "/" + message.GetDescriptor()->full_name();
@@ -209,7 +232,8 @@ void InitGeneratedTypeResolver() {
}
TypeResolver* GetGeneratedTypeResolver() {
- ::google::protobuf::GoogleOnceInit(&generated_type_resolver_init_, &InitGeneratedTypeResolver);
+ PROTOBUF_NAMESPACE_ID::internal::call_once(generated_type_resolver_init_,
+ InitGeneratedTypeResolver);
return generated_type_resolver_;
}
} // namespace
@@ -230,7 +254,7 @@ util::Status MessageToJsonString(const Message& message, string* output,
return result;
}
-util::Status JsonStringToMessage(const string& input, Message* message,
+util::Status JsonStringToMessage(StringPiece input, Message* message,
const JsonParseOptions& options) {
const DescriptorPool* pool = message->GetDescriptor()->file()->pool();
TypeResolver* resolver =