Я сейчас изучаю Elm и застрял на декодировании JSON.
У меня есть структура, представляющая блоки:
type alias Properties a =
{ a
| x : { v : Float, pos : Float }
, y : { v : Float, pos : Float }
, size : ( Float, Float )
, el : Float
}
type alias Pr =
{ v : Float, pos : Float }
type Block
= Block BlockType BlockProp
type alias BlockProp =
Properties { visibility : Int, tb : ( Float, Float ) }
type BlockType
= Rock
| Ground
И мне нужно декодировать блоки, сохраненные в JSON:
{
"blocks": [{
"type": "ground",
"x": {
"v": "0.0",
"pos": "30"
},
"y": {
"v": "0.0",
"pos": "100.0"
},
"sizex": "50.0",
"sizey": "70.0",
"el": "1.0",
"visibility": "1",
"t": "20.0",
"b": "30.0"
},
{
"type": "rock",
"x": {
"v": "0.0",
"pos": "30"
},
"y": {
"v": "0.0",
"pos": "100.0"
},
"sizex": "50.0",
"sizey": "70.0",
"el": "1.0",
"visibility": "1",
"t": "20.0",
"b": "30.0"
}
]
}
Может ли кто-нибудь помочь мне, как построить декодер для преобразования блоков, сохраненных в JSON, в type Block
? :)
edit: Я пробовал что-то вроде этого:
blockDecoder : Decoder BlockProp
blockDecoder =
map6 BlockProp
(field "x"
(map2 Pr
(field "v" float)
(field "pos" float)
)
)
(field "y"
(map2 Pr
(field "v" float)
(field "pos" float)
)
)
(field "size" -- I DON'T KNOW HOW TO CONVERT sizex AND sizey TO TUPLE
(field "el" float)
(field "visibility" float)
(field "tb" -- I DON'T KNOW HOW TO CONVERT t AND b TO TUPLE
У меня проблемы с преобразованием полей в кортежи ... Также я не знаю, как создать блок с правильный BlockType в зависимости от поля типа.