|
@@ -7,6 +7,74 @@ we recommend using protoc's Ruby generation support with .proto files. The
|
|
|
build process in this directory only installs the extension; you need to
|
|
|
install protoc as well to have Ruby code generation functionality.
|
|
|
|
|
|
+JSON Migration Note
|
|
|
+-------------------
|
|
|
+
|
|
|
+Users who were using the protobuf Gem `<= 3.0.0.alpha.5.0.4` will notice that
|
|
|
+the JSON format has changed slightly and is incompatible with previous
|
|
|
+versions.
|
|
|
+
|
|
|
+The change concerns field names. Prior to the change, field names from the
|
|
|
+.proto file were used verbatim. Take this `.proto` file:
|
|
|
+
|
|
|
+```protobuf
|
|
|
+syntax = "proto3";
|
|
|
+
|
|
|
+message M {
|
|
|
+ int32 my_int_field = 1;
|
|
|
+ bool my_bool_field = 2;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Serializing to JSON used to give you something like this:
|
|
|
+
|
|
|
+```json
|
|
|
+{"my_int_field":1, "my_bool_field":true}
|
|
|
+```
|
|
|
+
|
|
|
+However this format was not compatible with the proto3 JSON spec. To be
|
|
|
+compliant with proto3 JSON, we need to camel-case the names:
|
|
|
+
|
|
|
+```json
|
|
|
+{"myIntField":1, "myBoolField":true}
|
|
|
+```
|
|
|
+
|
|
|
+Starting with `3.0.0.alpha.5.0.5`, this bug was fixed and we now produce the
|
|
|
+correct camelCased names. However this may cause compatibility problems for
|
|
|
+JSON users who can't upgrade everything at the same time, or who store
|
|
|
+serialized JSON payloads. To mitigate this and allow time for migration, the
|
|
|
+library currently recognizes two environment variables:
|
|
|
+
|
|
|
+ - `UPB_JSON_ACCEPT_LEGACY_FIELD_NAMES`: set this variable to instruct the
|
|
|
+ JSON parser that the old names should be accepted in addition to the new,
|
|
|
+ compliant ones. This will make the parser compatible with both formats.
|
|
|
+ - `UPB_JSON_WRITE_LEGACY_FIELD_NAMES`: set this variable to instruct the
|
|
|
+ JSON serializer to encode the old, non-compliant names.
|
|
|
+
|
|
|
+These options will be removed in a future version of Ruby protobuf. All
|
|
|
+users shoud migrate to the standard names.
|
|
|
+
|
|
|
+If users have existing payloads in the old format and cannot easily migrate,
|
|
|
+the best solution would be to specify the old names explicitly in the
|
|
|
+`.proto` file using the `json_name` option. For example, for the .proto
|
|
|
+file above, the user could specify:
|
|
|
+
|
|
|
+```protobuf
|
|
|
+syntax = "proto3";
|
|
|
+
|
|
|
+message M {
|
|
|
+ int32 my_int_field = 1 [json_name="my_int_field"];
|
|
|
+ bool my_bool_field = 2 [json_name="my_bool_field"];
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+This will make all compliant proto3 JSON parsers/serializers use the
|
|
|
+non-camel-cased names forever. Note that protobuf Ruby does *not yet*
|
|
|
+support this option properly, but support is forthcoming. It will
|
|
|
+certainly be supported before the environment variables above are
|
|
|
+removed.
|
|
|
+
|
|
|
+
|
|
|
Installation from Gem
|
|
|
---------------------
|
|
|
|
|
@@ -32,23 +100,25 @@ documentation may be found in the RubyDoc comments (`call-seq` tags) in the
|
|
|
source, and we plan to release separate, more detailed, documentation at a
|
|
|
later date.
|
|
|
|
|
|
- require 'google/protobuf'
|
|
|
+```ruby
|
|
|
+require 'google/protobuf'
|
|
|
|
|
|
- # generated from my_proto_types.proto with protoc:
|
|
|
- # $ protoc --ruby_out=. my_proto_types.proto
|
|
|
- require 'my_proto_types'
|
|
|
+# generated from my_proto_types.proto with protoc:
|
|
|
+# $ protoc --ruby_out=. my_proto_types.proto
|
|
|
+require 'my_proto_types'
|
|
|
|
|
|
- mymessage = MyTestMessage.new(:field1 => 42, :field2 => ["a", "b", "c"])
|
|
|
- mymessage.field1 = 43
|
|
|
- mymessage.field2.push("d")
|
|
|
- mymessage.field3 = SubMessage.new(:foo => 100)
|
|
|
+mymessage = MyTestMessage.new(:field1 => 42, :field2 => ["a", "b", "c"])
|
|
|
+mymessage.field1 = 43
|
|
|
+mymessage.field2.push("d")
|
|
|
+mymessage.field3 = SubMessage.new(:foo => 100)
|
|
|
|
|
|
- encoded_data = MyTestMessage.encode(mymessage)
|
|
|
- decoded = MyTestMessage.decode(encoded_data)
|
|
|
- assert decoded == mymessage
|
|
|
+encoded_data = MyTestMessage.encode(mymessage)
|
|
|
+decoded = MyTestMessage.decode(encoded_data)
|
|
|
+assert decoded == mymessage
|
|
|
|
|
|
- puts "JSON:"
|
|
|
- puts MyTestMessage.encode_json(mymessage)
|
|
|
+puts "JSON:"
|
|
|
+puts MyTestMessage.encode_json(mymessage)
|
|
|
+```
|
|
|
|
|
|
Installation from Source (Building Gem)
|
|
|
---------------------------------------
|