1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
7
8 #include "google/protobuf/json/json.h"
9
10 #include <string>
11
12 #include "absl/status/status.h"
13 #include "absl/strings/string_view.h"
14 #include "google/protobuf/io/zero_copy_stream.h"
15 #include "google/protobuf/json/internal/parser.h"
16 #include "google/protobuf/json/internal/unparser.h"
17 #include "google/protobuf/util/type_resolver.h"
18 #include "google/protobuf/stubs/status_macros.h"
19
20 // Must be included last.
21 #include "google/protobuf/port_def.inc"
22
23 namespace google {
24 namespace protobuf {
25 namespace json {
26
BinaryToJsonStream(google::protobuf::util::TypeResolver * resolver,const std::string & type_url,io::ZeroCopyInputStream * binary_input,io::ZeroCopyOutputStream * json_output,const PrintOptions & options)27 absl::Status BinaryToJsonStream(google::protobuf::util::TypeResolver* resolver,
28 const std::string& type_url,
29 io::ZeroCopyInputStream* binary_input,
30 io::ZeroCopyOutputStream* json_output,
31 const PrintOptions& options) {
32 google::protobuf::json_internal::WriterOptions opts;
33 opts.add_whitespace = options.add_whitespace;
34 opts.preserve_proto_field_names = options.preserve_proto_field_names;
35 opts.always_print_enums_as_ints = options.always_print_enums_as_ints;
36 opts.always_print_fields_with_no_presence =
37 options.always_print_fields_with_no_presence;
38 opts.unquote_int64_if_possible = options.unquote_int64_if_possible;
39
40 // TODO: Drop this setting.
41 opts.allow_legacy_syntax = true;
42
43 return google::protobuf::json_internal::BinaryToJsonStream(
44 resolver, type_url, binary_input, json_output, opts);
45 }
46
BinaryToJsonString(google::protobuf::util::TypeResolver * resolver,const std::string & type_url,const std::string & binary_input,std::string * json_output,const PrintOptions & options)47 absl::Status BinaryToJsonString(google::protobuf::util::TypeResolver* resolver,
48 const std::string& type_url,
49 const std::string& binary_input,
50 std::string* json_output,
51 const PrintOptions& options) {
52 io::ArrayInputStream input_stream(binary_input.data(), binary_input.size());
53 io::StringOutputStream output_stream(json_output);
54 return BinaryToJsonStream(resolver, type_url, &input_stream, &output_stream,
55 options);
56 }
57
JsonToBinaryStream(google::protobuf::util::TypeResolver * resolver,const std::string & type_url,io::ZeroCopyInputStream * json_input,io::ZeroCopyOutputStream * binary_output,const ParseOptions & options)58 absl::Status JsonToBinaryStream(google::protobuf::util::TypeResolver* resolver,
59 const std::string& type_url,
60 io::ZeroCopyInputStream* json_input,
61 io::ZeroCopyOutputStream* binary_output,
62 const ParseOptions& options) {
63 google::protobuf::json_internal::ParseOptions opts;
64 opts.ignore_unknown_fields = options.ignore_unknown_fields;
65 opts.case_insensitive_enum_parsing = options.case_insensitive_enum_parsing;
66
67 // TODO: Drop this setting.
68 opts.allow_legacy_syntax = true;
69
70 return google::protobuf::json_internal::JsonToBinaryStream(
71 resolver, type_url, json_input, binary_output, opts);
72 }
73
JsonToBinaryString(google::protobuf::util::TypeResolver * resolver,const std::string & type_url,absl::string_view json_input,std::string * binary_output,const ParseOptions & options)74 absl::Status JsonToBinaryString(google::protobuf::util::TypeResolver* resolver,
75 const std::string& type_url,
76 absl::string_view json_input,
77 std::string* binary_output,
78 const ParseOptions& options) {
79 io::ArrayInputStream input_stream(json_input.data(), json_input.size());
80 io::StringOutputStream output_stream(binary_output);
81 return JsonToBinaryStream(resolver, type_url, &input_stream, &output_stream,
82 options);
83 }
84
MessageToJsonString(const Message & message,std::string * output,const PrintOptions & options)85 absl::Status MessageToJsonString(const Message& message, std::string* output,
86 const PrintOptions& options) {
87 google::protobuf::json_internal::WriterOptions opts;
88 opts.add_whitespace = options.add_whitespace;
89 opts.preserve_proto_field_names = options.preserve_proto_field_names;
90 opts.always_print_enums_as_ints = options.always_print_enums_as_ints;
91 opts.always_print_fields_with_no_presence =
92 options.always_print_fields_with_no_presence;
93 opts.unquote_int64_if_possible = options.unquote_int64_if_possible;
94
95 // TODO: Drop this setting.
96 opts.allow_legacy_syntax = true;
97
98 return google::protobuf::json_internal::MessageToJsonString(message, output, opts);
99 }
100
JsonStringToMessage(absl::string_view input,Message * message,const ParseOptions & options)101 absl::Status JsonStringToMessage(absl::string_view input, Message* message,
102 const ParseOptions& options) {
103 io::ArrayInputStream input_stream(input.data(), input.size());
104 return JsonStreamToMessage(&input_stream, message, options);
105 }
106
JsonStreamToMessage(io::ZeroCopyInputStream * input,Message * message,const ParseOptions & options)107 absl::Status JsonStreamToMessage(io::ZeroCopyInputStream* input,
108 Message* message,
109 const ParseOptions& options) {
110 google::protobuf::json_internal::ParseOptions opts;
111 opts.ignore_unknown_fields = options.ignore_unknown_fields;
112 opts.case_insensitive_enum_parsing = options.case_insensitive_enum_parsing;
113
114 // TODO: Drop this setting.
115 opts.allow_legacy_syntax = true;
116
117 return google::protobuf::json_internal::JsonStreamToMessage(input, message, opts);
118 }
119 } // namespace json
120 } // namespace protobuf
121 } // namespace google
122
123 #include "google/protobuf/port_undef.inc"
124