【发布时间】:2016-03-25 07:45:31
【问题描述】:
我和 Ruby 一起打了一个又一个的石头,但我一直在战斗。 今天我遇到了识别属性的问题。
我正在将对象序列化为 JSON,我的对象看起来像这样,其中属性 Items 是一个对象,其中包含 Item 类型的对象,而 address 是一个对象。
module OrderSet
class OrderObject
attr_accessor :items, :url, :email, :address, :id
def initialize args = nil
if args != nil
args.each do |k, v|
instance_variable_set("@#{k}", v) unless v.nil?
end
end
end
def to_json
hash = {}
self.instance_variables.each do |var|
# [1..-1] is to get rid of the leading @ from instance variables. This is so the API knows the variables.
hash[var[1..-1]] = self.instance_variable_get var
end
hash.to_json
end
end
end
如果我序列化它,它会以这样的 JSON 结尾(抱歉,混乱,但它不会格式化,因为它不是有效的 JSON...:
"{"address":"{\"name\":\"Ruby\",\"line1\":\"StoneStreet\",\"city\":\"Gemstones\",\"country\":\"The WOrld\",\"postCode\":\"4004VC\"}","items":"[\"{\\\"productId\\\":\\\"canvas_a60x60\\\",\\\"files\\\":\\\"{\\\\\\\"content\\\\\\\":\\\\\\\"http://i.imgur.com/uHZfjIU.jpg\\\\\\\"}\\\",\\\"quantity\\\":10,\\\"pageCount\\\":1,\\\"metaData\\\":\\\"test\\\"}\"]","email":"test@test.test"}"
它的外观:
"{"address":"{"name":"Ruby",
"line1":"StoneStreet",
"city":"Gemstones",
"country":"The WOrld",
"postCode":"4004VC"
}","items":"["{
"productId":"canvas_a60x60",
"files":"{"content":"http://i.imgur.com/uHZfjIU.jpg"
}","quantity":10,
"pageCount":1,
"metaData":"test"
}"]",
"email":"test@test.test"
}"
现在每个类都有自己的 to_json 方法,需要调用它并放入原始 to_json 方法的哈希中。我想出了一些解决方案:
- 做一个
object.is_a?(ClassName) - 检查模块(我有 4 个模块,总共包含大约 20 个类,所以第一个比第二个长得多)
- 创建一个基础对象,将所有其他对象扩展到该基础对象,检查它是否是基础对象的子对象并相应地调用 to_json(将 to_json 放在父对象中)
- 也许是一个静态方法,但我不知道它是否会像它调用
instance_variables那样工作
[编辑] 哎呀,忘了问这个问题,有没有比上述方法更好的方法,如果没有,上面哪一个是最好的?
【问题讨论】:
-
检查这些项目的类和JSON序列化有什么联系?
-
@FrederickCheung 属性中的类(具有自己的属性)没有正确序列化。如果您查看提供的 JSON,您会看到一大堆反斜杠,它们只出现在我自己的对象上,并添加到属性中。但这不是我需要的。我将使给定的 JSON 有效,并提供它需要的外观。然后你就可以看到了。
-
您的输出看起来好像您在哈希上调用了 to_json,其中值已经是通过调用 to_json 生成的字符串。可能子类的 to_json 实现有问题。
-
@FrederickCheung 所以你说如果我说 orderObject.to_json 它会调用属性类上的 to_json?如果是这样,那将如何运作?我越来越困惑。但我一直在努力去理解它,我一直在运行测试来弄清楚这一点。
-
这不是我要说的。 Hash 上的 to_json 方法将对所有值调用 to_json,因此它们的实现很重要。