【问题标题】:JSON Deserialization in RubyRuby 中的 JSON 反序列化
【发布时间】:2018-12-22 20:58:49
【问题描述】:

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

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

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

参考:

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

【问题讨论】:

  • JSON.parse 有什么问题?
  • 您将从 JSON Parse 获得一个 HashMap,而不是自定义/域对象表示 ASFAIK。 @spickermann
  • @Vineel Rubists 处理对象的方式不同。您真的需要“自定义/域”对象表示吗?
  • @vnbrs 是什么让您认为我们永远不需要从 JSON 字符串返回“域”对象? Ruby中没有这样的实用程序吗?
  • @Vineel 事实上 Ruby 在数据类型(动态 + 强类型)方面不是 Java =)。顺便说一句,我没有说我们永远不需要“域”。

标签: ruby-on-rails json ruby gson json-deserialization


【解决方案1】:

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

require 'json'

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

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

require 'json'
require 'ostruct'

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

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

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

【讨论】:

  • 注意:取决于性能对您的重要性,OpenStruct 会比仅使用 Hash 或使用类或 Struct 减慢您的速度。您可能想在某个时候对事物进行基准测试。
  • @vnbrs 打开链接后,我看到的就是这个。 “Ruby 2.0.0 的维护已于 2016 年 2 月 24 日结束。”
  • 在此之前我会使用hashie。我从来没有见过有人在任何地方的生产代码中使用 OpenStruct。
  • 好吧,如果我没记错的话,如果你使用 Rails,你就使用 OpenStruct,因为 Rails 在 Active Storage 的某些部分使用它。 Ruby 普通的 Struct 可能是一个替代方案。它没有 OpenStruct 的这种深度递归。
【解决方案2】:

jsonapi-rb

    DeserializablePost.call(json_hash)

roar

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

Netflix - fast_jsonapi

    json_string = MovieSerializer.new(movie).serialized_json

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2011-10-16
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多