Arrays .to_json on on Array()在Crystal中不工作

Arrays .to_json on on Array()在Crystal中不工作,arrays,json,crystal-lang,Arrays,Json,Crystal Lang,我有一门课: 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.fi

我有一门课:

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
这对任何
用户都非常有效。to_json
。但是当我有
Array(User)
users.to_json
)时,它会在编译时抛出以下错误:

在/usr/local/cillar/crystal lang/0.23.1_3/src/json/to_json.cr:66:no 重载将“User#to _json”与类型json::Builder匹配重载为: -用户#到_json() -对象#到_json(io:io) -对象#到_json()

Array(String)#to_json
工作正常,那么为什么
Array(User)#to_json

Array(User)#to_json
不起作用,因为
User
需要
to_json(json:json::Builder)
方法(而不是
to_json
),就像:


谢谢这也解决了其他问题。还可以看看
JSON.mapping
,这可能会稍微清理一下代码。
  each &.to_json(json)
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":"****"}]