Rails v 3.0.11,Ruby v 1.9.3
以下是我的类,其中包括ActiveModel::Serializers::JSON并覆盖as_json以输出具有自定义属性名称的 JSON。它使用其他类,如 Cell、Rows 和 Column,这些类又覆盖了自己的 as_json 并包含在其中的ActiveModel::Serializers::JSON。
class DataObject
include ActiveModel::Serializers::JSON
attr_accessor :rows, :columns, :options
def initialize(rows = [], cols = [], options = {})
@rows = rows
@columns = cols
@options = options
end
def add_row(row)
@rows << row
end
def add_column(column)
@columns << column
end
def attributes
{ 'rows' => rows, 'cols' => columns, 'options' => options}
end
def as_json(json_options = {})
json_hash = {cols: columns, rows: rows}
json_hash[:p] = options unless options.empty?
json_hash
end
def create_data
data = DataObject.new
data.add_column(Column.new('A', 'New A', 'string'))
data.add_column(Column.new('B', 'B-label', 'number'))
data.add_column(Column.new('C', 'Label-C', 'date'))
row1 = Row.new
row1.add_cell(Cell.new('first-a'))
row1.add_cell(Cell.new('first-b', 'First Alphabet B'))
row1.add_cell(Cell.new('first-c', 'First CCCCC'))
data.add_row(row1)
row2 = Row.new
row2.add_cell(Cell.new('second-a'))
row2.add_cell(Cell.new('second-b', 'Second Alphabet B'))
row2.add_cell(Cell.new('second-c', 'Second CCCCC'))
data.add_row(row2)
p data.to_json
end
end
当我像这样从rails控制台测试这个类时:
1.9.3dev :001 > dobject = DataObject.new
=> #<DataObject:0xb8fa970 @rows=[], @columns=[], @options={}>
1.9.3dev :002 > dobject.create_data
我得到以下格式的以下输出:
=> "{\"cols\":[{\"id\":\"A\",\"label\":\"New A\",\"type\":\"string\"},{\"id\":\"B\",\"label\":\"B-label\",\"type\":\"number\"},{\"id\":\"C\",\"label\":\"Label-C\",\"type\":\"date\"}],\"rows\":[{\"c\":[{\"v\":\"first-a\"},{\"v\":\"first-b\",\"f\":\"First Alphabet B\"},{\"v\":\"first-c\",\"f\":\"First CCCCC\"}]},{\"c\":[{\"v\":\"second-a\"},{\"v\":\"second-b\",\"f\":\"Second Alphabet B\"},{\"v\":\"second-c\",\"f\":\"Second CCCCC\"}]}]}"
它显示带有转义引号的 JSON,这使得它难以阅读。
有什么方法可以以可读的方式显示输出,即格式化的 JSON?
另外,如何覆盖 as_json 以便我可以利用其原始支持的选项,例如 :only、:except 和 :methods 并输出具有所需名称的 JSON 属性?
谢谢 ,
吉涅什