Ruby 中的 JSON 反序列化

Vin*_*eel 5 ruby json ruby-on-rails gson json-deserialization

在 Ruby 中是否有与 Java 的 Google JSON 等效的 JSON 反序列化。无需为每个类定义任何自定义序列化器或反序列化器,您可以编写一行代码将 JSON 字符串转换为自定义 Java 类,如下所示。

Address address=gson.fromJson(addressJsonStringForm, Address.class);

为了实现这一点,不需要在 Address 类中放置任何注释/接口,也不需要为我们需要反序列化的每个类编写单独的 Deserializer 实用程序。这使得从第三方库反序列化/序列化类变得非常容易。关于是否序列化空值/包含/排除某些属性等,有很多选项。我正在 Ruby 中寻找这样一个通用的 JSON 和自定义对象序列化/反序列化实用程序。我是 Ruby 的新手。

参考:

https://dzone.com/articles/deserializing-json-java-object

Vin*_*sil 6

您可以使用 JSON 模块将其转换为哈希:

require 'json'

hash = JSON.parse('{"age":18, "name":"Vinicius"}')
hash["age"]
=> 18
Run Code Online (Sandbox Code Playgroud)

如果要将其转换为“结构化”对象,可以使用 OpenStruct:

require 'json'
require 'ostruct'

person = JSON.parse('{"age":18, "name":"Vinicius"}', object_class: OpenStruct)
person.name
=> "Vinicius"
Run Code Online (Sandbox Code Playgroud)

OpenStruct 是一种类似于哈希的数据结构,它允许定义任意属性及其伴随的值。这是通过使用 Ruby 的元编程在类本身上定义方法来实现的。(文档)

如果您并不总是知道 JSON 键,OpenStruct 可能会帮助您,因为它会动态创建一个对象。

  • 注意:取决于性能对您的重要性,OpenStruct 会比仅使用 Hash,或使用类或 Struct 减慢您的速度。您可能想在某个时候对事物进行基准测试。 (3认同)

Osh*_*uma 4

jsonapi-rb

    DeserializablePost.call(json_hash)
Run Code Online (Sandbox Code Playgroud)

    song = Song.new(title: "Medicine Balls")
    SongRepresenter.new(song).from_json('{"title":"Linoleum"}')
    song.title #=> Linoleum
Run Code Online (Sandbox Code Playgroud)

Netflix - fast_jsonapi

    json_string = MovieSerializer.new(movie).serialized_json
Run Code Online (Sandbox Code Playgroud)