Единственное, что я хотел бы добавить к ответу Тодда Янделла, это то, что может быть полезно не иметь отдельных ключей для «атрибутов» и «детей». Другими словами, в то время как метод Янделла будет возвращать данные, подобные этому:
{
"attributes" : {
"field1": "dd",
"field2": "ee",
"children" : [{
"field1": "dd",
"field2": "ee",
}, {
"field1": "dd",
"field2": "ee",
}, {
"field1": "dd",
"field2": "ee",
}]
}
Вы можете пожелать, чтобы данные в вопросе выше были отформатированы следующим образом:
{
"field1": "dd",
"field2": "ee",
"children" : [{
"field1": "dd",
"field2": "ee",
}, {
"field1": "dd",
"field2": "ee",
}, {
"field1": "dd",
"field2": "ee",
}]
}
Этот формат особенно полезен в ситуациях, когда код на стороне клиента ожидает данные JSON в формате дерева и не позволяет гибко определять различные ключи для родительских атрибутов и дочерних элементов (например, компонент NestedList в Sencha Touch и т. Д.).
Чтобы достичь этого, основываясь на концепции Янделла, я придумал следующее:
def to_node
self.attributes.merge({:children => self.children.map { |c| c.to_node }})
end