Serializacja modeli do JSON


#1

Witam wszystkich.

mam problem z serializacją danych do JSON. Posiadam dwie klasy:

  • test.rb:

    class Test < ActiveModel::Serializer
    attr_accessor :id, :userName, :lista, :test2

    def initialize params = {}
      @lista = Array.new
     params.each { |key, value| send "#{key}=", value }
    

    end
    end

  • test2.rb:

      class Test2 < ActiveModel::Serializer
        attr_accessor :id, :userName
    
        def initialize params = {}
         params.each { |key, value| send "#{key}=", value }
       end
      end
    
  • test_serializer.rb:

      class TestSerializer < ActiveModel::Serializer
        attributes :id, :userName, :lista
        attributes :test2
       
        private
        def test2
          Test2Serializer.new(object.test2).as_json
        end
      end
    
  • test2_serializer.rb:

      class Test2Serializer < ActiveModel::Serializer
        attributes :id, :userName
      end
    
  • oraz kontroler:

      def postem
        new_test2 = Test2.new id: 2, userName: 'test2'
    
        new_test = Test.new id: 1, userName: 'test1', test2: new_test2
        new_test.lista << '2345';
        new_test.lista << 'string';
    
        p new_test;
        render json: TestSerializer.new(new_test).as_json
    	end
    

W wyniku działania powyższego kodu dostaję:

{
  "id": 1,
  "userName": "test1",
  "lista": [
    "2345",
    "string"
  ],
  "test2": {}
}

Czy ktoś może mi pomóc z serializacją obiektu test2? Dlaczego nic nie ma?


#2

@kondonja spróbuj metodę TestSerializer#test2 zmienić na publiczną


#3

@yan Serdeczne dzięki za podpowiedź to było to :slight_smile: poza tym musiałem jeszcze zmienić linijkę z

Test2Serializer.new(object.test2).as_json

na

Test2Serializer.new(object).as_json

Dla potomnych cały poprawny kod poniżej :slight_smile:

class TestSerializer < ActiveModel::Serializer
  attributes :id, :userName, :lista, :test2 
  public
  def test2
    Test2Serializer.new(object).as_json
  end
end

#4

Witam ponownie.

W nawiązaniu do powyższego tematu mam teraz problem z serializacją listy obiektów. :slight_smile:
Otrzymuję błąd:

NoMethodError (undefined methodread_attribute_for_serialization’ for #Array:0x00007f1bb52da460):`

po przedebugowaniu kodu doszedłem że wyjątek wyskakuje na tej linijce kodu:

object.read_attribute_for_serialization(attr)

W zmiennej object jest lista obiektów a podejrzewam że powinien być tam obiekt. Próbowałem w serializerze zamienić linijkę:

Test2Serializer.new(object.test2).as_json

na:
json: object.test2, each_serializer: Test2Serializer
lub:
object.test2, each_serializer: Test2Serializer

jednak są to błędne komendy. Mógłby mi ktoś podpowiedzieć jak powinno wywołanie wyglądać? Wujek google nie pomógł.


#5

Utknąłem na podobnym problemie… Chętnie poznałbym rozwiązanie :slight_smile:


#6

@kondonja @larsnait możecie wkleić kod, z którym jest problem?