有没有办法让JSON生成的字符串保留属性名称?从这个模型:
class Person
attr_accessor :name
def self.json_create(o)
new(*o['data'])
end
def to_json(*a)
{ 'json_class' => self.class.name, 'data' => [name] }.to_json(*a)
end
end
JSON生成此字符串:
{
"json_class": "Person",
"data": ["John"]
}
但我想要一个这样的字符串:
{
"json_class": "Person",
"data":
{
"name" : "John"
}
}
有没有办法做到这一点,仍然可以通过名称访问属性?像:
person.name
答案 0 :(得分:1)
您可以传递完整的属性,而不是指定' name':
def to_json(*a)
{ 'json_class' => self.class.name, 'data' => attributes }.to_json(*a)
end
如果要过滤特定属性,可以执行以下操作:
def to_json(*a)
attrs_to_use = attributes.select{|k,v| %[name other].include?(k) }
{ 'json_class' => self.class.name, 'data' => attrs_to_use }.to_json(*a)
end
如果您只想使用' name',请将其写出:)
def to_json(*a)
{ 'json_class' => self.class.name, 'data' => {:name => name} }.to_json(*a)
end
<强>更新强>
为了阐明如何使初始化程序处理所有属性,您可以执行以下操作:
class Person
attr_accessor :name, :other
def initialize(object_attribute_hash = {})
object_attribute_hash.each do |k, v|
public_send("#{k}=", v) if attribute_names.include?(k)
end
end
def attribute_names
%[name other] # modify this to include all publicly assignable attributes
end
def attributes
attribute_names.inject({}){|m, attr| m[attr] = send(attr); m}
end
def self.json_create(o)
new(o['data'])
end
def to_json(*a)
{ 'json_class' => self.class.name, 'data' => attributes }.to_json(*a)
end
end