2017-09-15 4 views
3
내가 크리스탈 랭에서 간단한 JSON 매핑 된 객체를 가지고 가정하자

, 예를 들면 : 쉽게 그래서 같은 JSON 문자열에서구문 분석 배열 크리스탈 랭에서 개체

class Item 
    JSON.mapping(
    id: UInt32, 
    name: String, 
) 
end 

내가 구문 분석 할 수있는 개별 개체 :

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 풀 파서로이 작업을 수행 할 수 있도록하고 싶습니다, 그래서 아마도 일부 매핑 트릭이있다 또는 힌트를 입력하십시오. 아이디어?

답변

5

이 부분은이 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" 
+0

굉장 - 고마워요! – maerics