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":"****"}]