解析Crystal lang中的JSON对象数组

时间:2017-09-15 19:50:27

标签: arrays json crystal-lang

假设我在Crystal lang中有一个简单的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的数组?我尝试了一些方法但不确定如何继续,例如:

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 pull解析器执行此操作,因此可能有一些映射技巧或类型提示我缺少。想法?

1 个答案:

答案 0 :(得分:6)

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"