2016-03-25 20 views
0

Ruby ile kayadan sonra kayaya çarpıyorum ama kavga etmeye devam ediyorum. Bugün bir özniteliği özümseme sorunum var.Bir sınıf özniteliğinin sınıfını bulmanın en iyi yolu

Nesneleri JSON'a serileştirmek için çalışıyorum ve nesnelerim öznitelikler öğesinde Nesne içinde nesne olan bir nesne ve adres bir nesnedir.

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 

bu serialize, bu karmaşa için özür böyle bir JSON (ile biter, ancak geçerli bir JSON değil gibi biçimlendirmek olmaz ...:

"{"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":"[email protected]"}" 

nasıl .

: "{"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":"[email protected]" }"

Şimdi her sınıf kendi to_json yöntemi var ve bu çağrılır ve orijinaldir to_json yönteminin karma koymak gerekir birkaç çözümler gelmiş: o bakmak gerekiyor

  1. bir object.is_a?(ClassName)
  2. (i toplamda yaklaşık 20 sınıfları içeren, 4 modül var, o yüzden birincisi ikincisi çok daha uzundur) bir taban nesnesi yapmak
  3. modülünü kontrol edin mı, uzatmak Buna diğer tüm nesneler, temel nesnesinin bir alt öğesi olup olmadığını kontrol edin ve to_json'u buna göre çağırın (to_json'u parrent'e koyarak)
  4. Belki de statik bir yöntemdir, ancak çağrıların çalışıp çalışmadığını bilmiyorum instance_variables

[değiştir] woops, soruyu sormayı unutmuş, yukarıdakilerden daha iyi bir yol var mıdır ve değilse, yukarıdakilerden hangisi en iyisidir? Basit bir test olarak, denemek ve aslında tüm bu altında oluyor bekliyorsanız ne yazacağız meta programlama bir çok kullandığınız yana

+0

Bu öğeler sınıfının kontrol edilmesi ile JSON serileştirme arasındaki bağlantı nedir? –

+0

@FrederickCheung Özniteliklerde (kendi öznitelikleriyle) bulunan sınıfların düzgün bir şekilde serileştirilmemesi. Sağlanan JSON'a bakarsanız, ters eğik çizgilerden oluşan bir tekne yükü görürseniz, bunlar yalnızca kendim olan ve özniteliklere eklenen nesneler üzerinde gerçekleşir. Ama ihtiyacım olan şey bu değil. Verilen JSON'ı geçerli hale getireceğim ve nasıl görünmesi gerektiği konusunda bilgi vereceğim. O zaman görebileceksiniz. –

+0

Çıktınız, to_json çağrılarak değerlerin zaten dizeler oluşturulduğu bir hash üzerinde to_json çağrmışsınız gibi görünüyor. Belki de çocuk sınıfları üzerinde to_json uygulaması hatalı. –

cevap

1

: Oradan

def to_json 
    hash = {} 
    hash["address"] = @address 
    hash.to_json 
end 

, denemek ve dışarı nerede anlamaya senin hatan.

Düzenleme: Örneğin

:

class Address 
    def to_json(options={}) 
    {"name" => "foo"}.to_json 
    end 
end 

order_set = OrderSet::OrderObject.new({"address" => Address.new }) 
order_set.to_json 

bu ne sonra mı?

module JSONable 
    def to_json(options={}) 
    hash = {} 
    self.instance_variables.each do |var| 
     hash[var[1..-1]] = self.instance_variable_get var 
    end 
    hash.to_json 
    end 
end 


class Address 
    include JSONable 
    # Rest of code 
end 
+0

Sınıfları ve yöntemleri aramayı denedim. Yuvalanmış bir nesnem olmadığı sürece her şey planlandığı gibi gider. Ama nesne çalmaya geldiğinde ... işe yaramıyor ... –

+0

Ahh Anladım, test ettim. Hash.Fredrick Cheung üzerinde to_json çağırdığınızda Adres nesnesinin bir to_json yöntemine gereksinimi vardır, büyük olasılıkla Adres sınıfı to_json yöntemindeki bir hatadır. Ayrıca JSON.parse test etmek için iyi bir yoldur. – jeremy04

+0

Tam olarak to_json yöntemiyle aynıdır, bu yüzden sorum da belki biraz daha DRY yapmak, bir ana sınıf yapmak ve to_json'u oraya taşımak için her yerde aynı kodun daha az olmasını gerektiriyor. –

İlgili konular