Правильный анализ массива JSON как объекта пользовательского типа данных - PullRequest
1 голос
/ 01 июля 2019

Я определил следующий объект типа данных в Haskell:

import GHC.Generics
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as C
import Data.Maybe (fromJust)

data DLA = DLA {
                a::String,
                b::Int,
                c::Int,
                d::String,
                e::[Int]
                } deriving (Show, Generic)

instance FromJSON DLA
instance ToJSON DLA

И получить массив json из какого-либо фронтенд-приложения в следующем формате

[\"hello\",3,2,\"world\",[1,3,5]]

Когда я попытался разобрать это как

decode $ C.pack "[\"hello\",3,2,\"world\",[1,3,5]]"::Maybe DLA

просто вернул Nothing. Попытка передать это более общее как

decode $ C.pack "[\"hello\",3,2,\"world\",[1,3,5]]"::Maybe Value

вернул следующий вывод:

Just (Array [String "hello",Number 3.0,Number 2.0,String "world",Array [Number 1.0,Number 3.0,Number 5.0]])

Так что, похоже, проблема в том, что Haskell интерпретирует строку как массив, а не объект, и, таким образом, правильно выдает исключение. Любые идеи, как это исправить?

Я использую текущую версию ghc и ghci и Data.Aeson для этого.

1 Ответ

1 голос
/ 01 июля 2019

Я нашел решение, которое довольно просто с использованием сопоставления с образцом, но более прямые подходы также приветствуются, так как я считаю, что для этого должны быть некоторые функции.

raw = fromJust (decode $ C.pack "[\"hello\",3,2,\"world\",[1,3,5]]"::Maybe (String, Int, Int,   String, [Int]))

func::(String, Int, Int, String, [Int]) -> DLA
func (a,b,c,d,e) = DLA a b c d e
...