我应该在 Rails 应用程序的哪个位置放置将不同 JSON 字符串展平为类友好格式的功能?

Posted

技术标签:

【中文标题】我应该在 Rails 应用程序的哪个位置放置将不同 JSON 字符串展平为类友好格式的功能?【英文标题】:Where in Rails app do I put functionality that flattens different JSON strings to a class friendly format? 【发布时间】:2016-06-28 00:29:04 【问题描述】:

例如这些json结构需要转换成如下类:

JSON_str_1 = "a":"stuff", "b":"aa": "more_stuff", "bb":"even_more"
JSON_str_2 = "a": "stuff", "aa": "more_stuff","b": "bb":"even_more"
JSON_str_3 = "b": "a":"stuff" "aa": "more_stuff", "bb":"even_more"

到这种格式的类:

class my_class < ActiveRecord
   attr_accessor: :a, :aa, :bb
end

我需要编码的所有信息都是相同的,只是结构不同。 这基本上涉及扁平化 json 结构。 一个人会怎么处理呢? 在 Rails 应用程序的什么地方可以放置转换功能?该模型?控制器?某处的PORO?

我有很多这种从未优化的 JSON 到我的类特定格式的转换,这似乎是一个很常见的问题。

【问题讨论】:

这个json是从哪里来的?在请求中? 我认为这应该属于模型。 @NomanUrRehman:是的,来自请求。这将特定于一条路线。另一条路线可能具有相同信息的不同格式,也必须转换为该模型。这就是为什么我想知道在调用模型之前是否应该在控制器中进行转换。或者做一个转换类。只是不知道该怎么做。 @Cthulhu:我是这么想的,但可能有一系列不同的 JSON 字符串编码相同的信息,它们都必须转换为该模型的格式。这就像每个 JSON 转换需要一种方法。 我的直觉是一个转换器 mixin。 【参考方案1】:

我将从模型中的一个方法开始:

def self.from_json(json)
  new(a: json['a'], aa: json['a']['aa'], bb: json['a']['bb'])
end

应该怎么称呼:

foo = MyClass.from_json(JSON_str)

【讨论】:

如果有不同的格式需要转换呢?你会为每次转化添加一个类吗?或者你会在某个时候把它排除在外吗? 一旦有两种以上的不同格式,或者如果格式比您的示例更复杂,我将生成一个转换器类。但我会尽量将所有内容都放在一个类中,只要它有意义、可维护且易于理解。 您的更新答案现在包含更多示例。但是所有示例都遵循相同的模式,并且结构非常简单。像answer 中的这种小辅助方法仍然可以解决问题。一个类方法和一个辅助方法是否可以单独证明一个类?我会说这取决于该类是否可重用,或者它是否仅用于一个地方以生成一个特定类的实例。

以上是关于我应该在 Rails 应用程序的哪个位置放置将不同 JSON 字符串展平为类友好格式的功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何放置稳定的标记(图像上的实心圆圈)。下一帧相机中哪个位置相同?

Rails:放置在哪里以及如何调用预定的清理方法

我应该使用哪个加载项来存储我的Rails应用程序

Rails:为特定视图放置 onload 的位置

哪个更适合tkinter网格,放置单个项目或循环遍历列表来放置它们?

Rails 4.2常量 - 放置它们的位置:application.yml vs custom config file.rb