• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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