代码之家  ›  专栏  ›  技术社区  ›  twharmon

.to\u Array()上的json在Crystal中不工作

  •  3
  • twharmon  · 技术社区  · 7 年前

    我有一门课:

    class User
        property id : Int32?
        property email : String?
        property password : String?
    
        def to_json : String
            JSON.build do |json|
                json.object do
                    json.field "id", self.id
                    json.field "email", self.email
                    json.field "password", self.password
                end
            end
        end
    
        # other stuff
    end
    

    这适用于任何 user.to_json Array(User) ( users.to_json )它在编译时抛出此错误:

    在/usr/local/Cellar/crystal lang/0.23.1_3/src/json/to_json中。cr:66:否 重载将“User#to_json”与类型json匹配::Builder重载为: -对象#to_json(io:io) -对象#to_json()

      each &.to_json(json)
    

    Array(String)#to_json 很好,为什么不呢 Array(User)#to_json ?

    1 回复  |  直到 7 年前
        1
  •  7
  •   Vitalii Elenhaupt    7 年前

    Array(User)#to_json 不起作用,因为 User 需要有 to_json(json : JSON::Builder) 方法(非 to_json ),就像 String has :

    require "json"
    
    class User
      property id : Int32?
      property email : String?
      property password : String?
    
      def to_json(json : JSON::Builder)
        json.object do
          json.field "id", self.id
          json.field "email", self.email
          json.field "password", self.password
        end
      end
    end
    
    u = User.new.tap do |u|
      u.id = 1
      u.email = "test@email.com"
      u.password = "****"
    end
    
    u.to_json      #=> {"id":1,"email":"test@email.com","password":"****"}
    [u, u].to_json #=> [{"id":1,"email":"test@email.com","password":"****"},{"id":1,"email":"test@email.com","password":"****"}]