2016-03-08 3 views
0

Я делаю TodoList, и хочу сохранить список в файле JSON, но он сохраняет только имя класса.Класс в массиве преобразовать в JSON

Вот код:

require 'date' 
require 'json' 
class TodoList 
    attr_accessor :title 

    def initialize(title) 
     @title=title 
     @items=[] 
    end 

    def rename(title) 
     @title=title 
    end 

    def add_item(new_item, due_date) 
     item=Item.new(new_item) 
     item.set_due_date(due_date)     
     @items.push(item) 
    end 

    def save 
     if json_instance = self.to_json 
      puts "Saved Successfully" 
     end 

     File.open("file_json_complete.json", "w") do |f| 
      f.write(json_instance) 
     end 
    end 
end 

class Item 
    attr_reader :complete_status, :description, :due_date, :created_at  

    def initialize(description) 
     @description=description 
     @complete_status=false 
     @created_at=Date.today 
    end 
end 

doh=TodoList.new("doh's stuff") 
# Add four new items 
doh.add_item("laundry", 10) 
doh.add_item("study",20) 
doh.add_item("sleep", 15) 
doh.add_item("Watch Movie", 5) 
doh.save 

В результате в файле только показывает имя класса TodoList:0x00000000965e88.

ответ

0

Чтобы сделать это правильно, я бы рекомендовал добавить следующее:

class TodoList 
    def to_json(options={}) 
    {title: @title, items: @items}.to_json(options) 
    end 
end 

class Item 
    def to_json(options={}) 
    {description: @description, completed: @complete_status, 
     created: @created_at, due: @due_date}.to_json(options) 
    end 
end 

Затем, когда вы звоните to_json на TodoList вы получите что-то подобное:

"{\"title\":\"doh's stuff\", 
    \"items\":[ 
     {\"description\":\"laundry\",\"complete\":false,\"created\":\"2016-03-08\",\"due\":\"2017-01-08\"}, 
     {\"description\":\"study\",\"complete\":false,\"created\":\"2016-03-08\",\"due\":\"2017-11-08\"}, 
     {\"description\":\"sleep\",\"complete\":false,\"created\":\"2016-03-08\",\"due\":\"2017-06-08\"}, 
     {\"description\":\"Watch Movie\",\"complete\":false,\"created\":\"2016-03-08\",\"due\":\"2016-08-08\"} 
    ] 
}" 

Который я предполагаю, это то, что вы ищете.

В основном to_json будет рекурсивный вызов to_json на вложенные объекты, чтобы создать структуру это будет в конечном итоге недобросовестный к to_s методу, когда вы не реализовали метод to_json.

+1

спасибо. это именно то, что я хочу .. –

0

Вы сохраняете текущий экземпляр класса TodoList.
Вы должны сохранить переменную @items. Для этого нужно изменить self.to_json к @items.to_json

0
class TodoList 

    ... 

    def save 
    File.open("file_json_complete.json", "w") do |f| 
     f.write(@items.to_json) 
    end 
    puts "Saved Successfully" 
    end 

    ... 

end 
Смежные вопросы