2017-04-03 183 views
0

我找到反向而不是为嵌套的方式结构,以JSON转换嵌套的结构以JSON

假设的答案,我有这种红宝石结构

Attributes = Struct.new :name, :preferredLanguage, :telephoneNumber, :timeZone 
User = Struct.new :email, :service, :preferredLanguage, :attributes 

我创建属性

的结构
attributes = Attributes.new "Pedro", "es", "5555555", "Madrid" 
# => #<struct Attributes name="Pedro", preferredLanguage="es", telephoneNumber="5555555", timeZone="Madrid"> 
attributes.to_h.to_json 
# => "{\"name\":\"Pedro\",\"preferredLanguage\":\"es\",\"telephoneNumber\":\"5555555\",\"timeZone\":\"Madrid\"}" 
Oj.dump attributes 
# => "{\"^u\":[\"Attributes\",\"Pedro\",\"es\",\"5555555\",\"Madrid\"]}" 
Oj.dump attributes, mode: :compat 
# => "\"#<struct Attributes name=\\\"Pedro\\\", preferredLanguage=\\\"es\\\", telephoneNumber=\\\"5555555\\\", timeZone=\\\"Madrid\\\">\"" 

因此,它运作良好,除了当我使用宝石Oj,我不能删除对象的名称,并得到相同的to_h.to_json方法

但问题是当我使用嵌套的结构像用户

user = User.new "[email protected]", "coolService", "es", attributes 
# => #<struct User email="[email protected]", service="coolService", preferredLanguage="es", attributes=#<struct Attributes name="Pedro", preferredLanguage="es", telephoneNumber="5555555", timeZone="Madrid">> 
user.to_h.to_json 
# => "{\"email\":\"[email protected]\",\"service\":\"coolService\",\"preferredLanguage\":\"es\",\"attributes\":\"#<struct Attributes name=\\\"Pedro\\\", preferredLanguage=\\\"es\\\", telephoneNumber=\\\"5555555\\\", timeZone=\\\"Madrid\\\">\"}" 
Oj.dump user, mode: :compat 
# => "\"#<struct User email=\\\"[email protected]\\\", service=\\\"coolService\\\", preferredLanguage=\\\"es\\\", attributes=#<struct Attributes name=\\\"Pedro\\\", preferredLanguage=\\\"es\\\", telephoneNumber=\\\"5555555\\\", timeZone=\\\"Madrid\\\">>\"" 

随着to_h.to_json我得到的属性的字符串对象,并与OJ,这不是有效的JSON。而且我还有一个问题,有从Java任何GSON,杰克逊库如果你使用的ActiveSupport(导轨)的作品在红宝石

回答

1

以同样的方式,你会得到这样的开箱。正如你似乎可以用准系统红宝石,只是做递归:

hashify = lambda do |struct| 
    as_hash = struct.to_h 
    struct_keys = as_hash.select { |_, v| v.is_a? Struct }.map(&:first) 
    struct_keys.each { |key| as_hash[key] = hashify.(as_hash[key]) } 
    as_hash 
end 

hashify.(user).to_json 
    # => "{\"email\":\"[email protected]\",\"service\":\"coolService\",\"preferredLanguage\":\"es\",\"attributes\":{\"name\":\"Pedro\",\"preferredLanguage\":\"es\",\"telephoneNumber\":\"5555555\",\"timeZone\":\"Madrid\"}}" 

至于GSON,似乎有a wrapper for Ruby,但我不认为这是广泛使用。 Rails的猴子补丁行为足以满足99.99%的可能用途。它还可以让你定义你的自定义序列化器,如果你想改变它。