将 JSON 数组正确解析为自定义数据类型对象
Correctly Parsing a JSON Array as Custom Data Type Object
我在 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 为此。
我找到了一个使用模式匹配非常简单的解决方案,但也欢迎使用更直接的方法,因为我相信应该有一些功能。
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
我在 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 为此。
我找到了一个使用模式匹配非常简单的解决方案,但也欢迎使用更直接的方法,因为我相信应该有一些功能。
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