【问题标题】:Converting a nested OpenStruct to JSON将嵌套的 OpenStruct 转换为 JSON
【发布时间】:2019-04-03 13:08:06
【问题描述】:

使用 JSON.parse 创建嵌套的 OpenStruct 对象似乎很容易:

JSON.parse( '{"a":{"b":0}}', object_class:OpenStruct )
#<OpenStruct a=#<OpenStruct b=0>>

是否有更简单的方法将其转换回 json,而无需创建递归函数(如此处所示:Deep Convert OpenStruct to JSON)?

【问题讨论】:

    标签: ruby-on-rails ruby type-conversion ruby-on-rails-5 ruby-2.5


    【解决方案1】:

    在你的结构上调用 OpenStruct#to_json 应该可以做到:

    [2] pry(main)> JSON.parse('{"a":{"b":0}}', object_class:OpenStruct).to_json
    => "{\"a\":{\"b\":0}}"
    

    从普通的 irb OpenStruct#to_json 不起作用:

    irb(main):003:0> require 'ostruct'
    => true
    irb(main):004:0> require 'json'
    => true
    irb(main):005:0> JSON.parse('{"a":{"b":0}}', object_class:OpenStruct).to_json
    => "\"#<OpenStruct a=#<OpenStruct b=0>>\""
    

    红宝石 2.5.3,轨道 4.2.11.1

    【讨论】:

    • 嗨,马丁,感谢您的回复。这是一个很好的建议,也是我尝试过的;但是,我得到的结果是"{\"table\":{\"a\":{\"table\":{\"b\":0},\"modifiable\":true}},\"modifiable\":true}"。也许我做错了什么,但我所看到的只是修改as_jsonto_json,因为table 是OpenStruct 的一个实例。这是我的示例输出:"{\"table\":{\"key1\":{\"table\":{\"key2\":1}}}}" -- 你可能已经修改了 to_json 的版本?
    • @Mike 不,我没有修改任何内容。请更新您的问题,因为我真的不明白 tablesOpenStruct 和您当前的问题有什么关系。指定您的输入和所需的输出
    • 我想避免使问题复杂化。这可能是特定于 rails 的问题,因为我注意到 irb 和 rails 控制台之间的行为不同。请参考这里的例子stackoverflow.com/questions/7835047/…;请注意,在提出的问题中,从 OpenStruct 转换时有一个 table 键。在我的版本中,我还看到了一个 modifiable 键(如我上面的评论中列出的)
    • @Mike 你运行的是什么版本的 ruby​​ 和 rails?我在 Rails 控制台中执行此操作,但看不到 table 键。来自stackoverflow.com/questions/7835047/… 问题的示例也是如此。我有 rails 4.2.11.1 和 ruby​​ 2.5.3
    • ruby 2.5 / rails 5.1(我在问题上使用了 rails-5 标签,但看起来我需要为 ruby​​ 版本更新问题)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2020-10-28
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多