当前位置: 首页 > 面试题库 >

如何使用JSON进行Ruby对象序列化

章子航
2023-03-14
问题内容

我有一个像这样的简单容器类的结构(在伪红宝石中):

class A
  attr_reader :string_field1, :string_field2
  ...
end

class B
  attr_reader: int_field3, :string_field4
  ...
end

# C includes an instance of A and B
class C
  attr_reader: :a_instance, :b_instance
  ...
end

有没有简单的方法可以在Ruby中将其反序列化为JSON?还是应该像本例一样为每个类制作嵌套的序列化方法?

编辑:

在我的特定情况下,我想将一些JSON数据发布到运行Ruby的服务器上,该服务器将提取数据并采取相应的措施。

JSON的发送者不一定是Ruby进程,而可能是其他系统的后端。(尽管在我的测试工具中是Ruby)。

因此,我不需要JSON采用某种“特定于Ruby的”格式,我只是假设如果将其实际内置于Ruby中会更容易。


问题答案:

将Marshal,PStore或其他Ruby解决方案用于非JSON对象

有人可能会奇怪,为什么像Ruby这样的完全反射性语言不能自动执行JSON生成和任意类的解析。

但是,除非坚持使用JSON类型,否则除了发送给其他正在运行的Ruby之外,没有其他地方可以发送或接收JSON对象。在那种情况下,我怀疑传统的看法是“忘记JSON,使用像核心类这样的本地Ruby接口Marshal

因此,如果您确实要将这些对象发送到PHP或非Ruby的对象,则应该使用Array等直接创建支持JSON的Ruby数据结构,然后使用JSON.generate直接处理这些对象。

如果只需要序列化,则可以使用MarshalPStore

更新:啊哈,好的,试试这个:

module AutoJ
  def auto_j
    h = {}
    instance_variables.each do |e|
      o = instance_variable_get e.to_sym
      h[e[1..-1]] = (o.respond_to? :auto_j) ? o.auto_j : o;
    end
    h
  end
  def to_json *a
    auto_j.to_json *a
  end
end

如果然后您include AutoJ在每个班级中都应该使用DTRT。在您的示例中,这导致

{
  "a": {
    "string_field1": "aa",
    "string_field2": "bb"
  },
  "b": {
    "int_field3": 123,
    "string_field4": "dd"
  }
}

您可能希望将auto_j方法更改为return h.values而不是just h,在这种情况下,您将获得:

[
  ["aa", "bb"],
  [123, "dd"]
]


 类似资料:
  • 问题内容: 我有一个Python ,其中包含带有和方法的对象,以确保集合中没有重复项。 我需要对该结果进行json编码,但是即使将一个空值传递给该方法也会引发。 我知道我可以为具有自定义方法的类创建扩展,但是我什至不知道从哪里开始进行转换。我是否应该使用默认方法中的值创建字典,然后返回该方法的编码?理想情况下,我想使默认方法能够处理原始编码器阻塞的所有数据类型(我将Mongo用作数据源,所以日期似

  • 问题内容: 我想使用simplejson序列化Django模型。Django的序列化器不支持字典…,而simplejson不支持Django Querysets。这是一个难题。 在该模型中,有一个具有“外键”赞助商级别的赞助商,我试图将属于某个赞助商级别的所有赞助商分组在一起。这是生成列表的代码: 这是“制造”后的样子 我只在每个级别添加了一个赞助商,除了铜牌,只是为了展示其工作原理。我要做的就是

  • 问题内容: 我正在寻找对JSON的增强,该增强还将对方法进行序列化。我有一个对象,它充当对象的集合,并且还希望序列化集合对象的方法。到目前为止,我已经找到了ClassyJSON。有什么想法吗? 问题答案: 我认为序列化方法从来都不是一个好主意。如果打算在服务器端运行代码,则容易受到攻击。如果要在客户端运行它,最好不要使用本地方法,最好引用要在序列化对象中使用的方法的名称。 我确实相信这会为您提供一

  • 问题内容: 我已经寻找了一段时间,想要一种对JSON对象进行排序的方法,如下所示: 并按字母顺序按值“ COMMERCIALNAME_E”得到: 我找不到任何可以做到这一点的代码。谁能给我些帮助? 问题答案: 将这些JSON解析为“对象集合”,然后使用比较器通过您喜欢的字段对其进行排序。 使用GSON将其解析为对象集合 例: 如果要从Object创建JSON。

  • 我想使用杰克逊2.13.3将数据结构序列化为JSON。我创建了一个简化的示例数据结构来显示所需的序列化是什么。 数据结构由一个主组成,其中包含一个的列表。元素之间有一些链接。 在示例中,我创建了元素的以下链接结构: 目标是序列化通过链接信息的ID表示链接数据。元素的完全序列化应该只发生在容器的顶级列表中。这与jackson在序列化过程中遇到元素的顺序不一致。 我想得到以下输出:

  • 我有一个JSON,它带有一个包含任意键和值类型的标记,我想将其读入Java中POJO内的映射。映射将是指向JsonValue或JsonNode之类的字符串。我正在使用对象映射器解析json。 有人对如何设置我的POJO来与杰克逊一起完成这一任务有什么建议吗?还是一种更好的方式? Json示例: 映射方法: 我的POJO: