【问题标题】:Wrap a crystal object into a custom root object in JSON将水晶对象包装到 JSON 中的自定义根对象中
【发布时间】:2016-10-06 22:03:53
【问题描述】:

我有一个像下面这样的课程

class Foo 
  JSON.mapping(
    bar: String,
    baz: String,
  )
end

我知道我可以通过在 JSON.mapping 中指定 {root: "name of node"} 来将单个属性包装在 JSON 对象中。但是有没有办法为整个Foo 班级做到这一点?

所以输出看起来像这样?

{
  "foo": {
    "bar": "",
    "baz": ""
  }
}

【问题讨论】:

    标签: json crystal-lang


    【解决方案1】:

    没有办法做到这一点,但你可以这样做:

    require "json"
    
    class Foo
      JSON.mapping(
        bar: String,
        baz: String,
      )
    
      def initialize(@bar : String, @baz : String)
      end
    end
    
    foo = Foo.new("r", "z")
    json = {foo: foo}.to_json
    puts json
    

    【讨论】:

    • 有趣,感谢您的回答!我现在唯一的问题是我的问题有点太抽象了:/问题现在似乎在于这样一个事实,即我的对象已经是我正在调用#to_json 的其他对象中的嵌套对象。我尝试了覆盖#to_json 并返回{foo: self}.to_json 的天真方法,但这不起作用。
    • 那你为什么不使用root作为封闭对象上带有Foo的字段呢?
    【解决方案2】:

    作为我评论的替代方案,您还可以覆盖Footo_json方法:

    def to_json(builder : JSON::Builder)
      builder.object do
        builder.field "foo" do
          previous_def
        end
      end
    end
    

    https://carc.in/#/r/286q

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多