解析 Crystal 语言中 JSON 个对象的数组
Parse Array of JSON Objects in Crystal lang
假设我在 Crystal 语言中有一个简单的 JSON 映射对象,例如:
class Item
JSON.mapping(
id: UInt32,
name: String,
)
end
我可以像这样轻松地从 JSON 个字符串中解析单个对象:
foo = Item.from_json(%({"id":1,"name":"Foo"}))
puts "OK: foo=#{foo}"
# => OK: foo=Item(@id=1, @name="Foo")
但是我如何从 JSON 字符串中解析 数组 项?我尝试了几种方法,但不确定如何进行,例如:
items_str = %([{"id":1,"name":"Foo"},{"id":2,"name":"Bar"}])
items : Array(Item) = JSON.parse(items_str)
# => Error in foo.cr:15: type must be Array(Item), not JSON::Any
当然,我也希望能够使用 JSON 拉式解析器来执行此操作,因此大概缺少一些映射技巧或类型提示。想法?
在这个 spec 中找到了它。所以,你可以使用 Array(Item).from_json
:
items = Array(Item).from_json %([{"id":1,"name":"Foo"},{"id":2,"name":"Bar"}])
items.first.id #=> 1
items.first.name #=> "Foo"
items.last.id #=> 2
items.last.name #=> "Bar"
假设我在 Crystal 语言中有一个简单的 JSON 映射对象,例如:
class Item
JSON.mapping(
id: UInt32,
name: String,
)
end
我可以像这样轻松地从 JSON 个字符串中解析单个对象:
foo = Item.from_json(%({"id":1,"name":"Foo"}))
puts "OK: foo=#{foo}"
# => OK: foo=Item(@id=1, @name="Foo")
但是我如何从 JSON 字符串中解析 数组 项?我尝试了几种方法,但不确定如何进行,例如:
items_str = %([{"id":1,"name":"Foo"},{"id":2,"name":"Bar"}])
items : Array(Item) = JSON.parse(items_str)
# => Error in foo.cr:15: type must be Array(Item), not JSON::Any
当然,我也希望能够使用 JSON 拉式解析器来执行此操作,因此大概缺少一些映射技巧或类型提示。想法?
在这个 spec 中找到了它。所以,你可以使用 Array(Item).from_json
:
items = Array(Item).from_json %([{"id":1,"name":"Foo"},{"id":2,"name":"Bar"}])
items.first.id #=> 1
items.first.name #=> "Foo"
items.last.id #=> 2
items.last.name #=> "Bar"