haskell - Aeson 解码结果为“无”

标签 haskell aeson

我正在使用此代码:

{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import Data.Maybe
import Data.ByteString.Lazy
import Control.Applicative
import Debug.Trace
import Control.Monad
import qualified Data.Aeson.Types as T

main = do
  res <- liftA show (liftA decodeOriginal (Data.ByteString.Lazy.readFile "./a.json"))
  Prelude.putStrLn res

interpretResult :: Maybe String -> String
interpretResult Nothing = "Error."
interpretResult x = fromJust x

data TotalLine1 = TotalLine1 {
  timestamp :: Integer,
  value :: Integer
} deriving (Eq, Show)

data Original = Original {
  totals :: [TotalLine1]
} deriving (Eq, Show)

instance FromJSON Original where
  parseJSON (Object v) = traceStack "Original" (Original <$> (parseJSON =<< (v .: "visitors.total")))
  parseJSON _ = mzero

instance FromJSON TotalLine1 where
  parseJSON (Object v) = TotalLine1 <$>
                         v .: "timestamp" <*>
                         v .: "value"
decodeOriginal :: ByteString -> Maybe Original
decodeOriginal b = traceStack "decoding" (do
  a <- decode b :: Maybe Original
  return a)

尝试像这样解析 JSON:

{
visitors.total: [
{
timestamp: 1365548400,
value: 1
},
{
timestamp: 1365548700,
value: 2
},
{
timestamp: 1365549000,
value: 5
},
]
}

但是 main 每次都返回 Nothing 。我做错了什么?看来 Original 甚至没有调用 parseJSON。

最佳答案

您的 JSON 文件无效。

一方面,字段的名称必须加引号,

"timestamp"

等等。另一方面,TotalLine1 列表中有一个尾随逗号,这会导致 ByteString 解码为 Value 失败。引用字段名称并删除结尾的逗号,这样就可以了。

关于haskell - Aeson 解码结果为“无”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15960176/

相关文章:

compiler-errors - "handle"函数和 Real World Haskell

json - 具有自定义键类型的 Data.Map.Strict.Map 的 Aeson 编码导致数组数组而不是对象

haskell - 用 aeson 解析 utctime

Haskell:无法导入 System.Random

haskell - 如何在Haskell中实现词法分析器和解析器

haskell - 递归中的部分应用函数

haskell - Stack (Haskell) 使用 GitHub Actions 构建源文件缓存

haskell - 在 Aeson 中发送/接收二进制数据

haskell - 在 aeson 中,如何从 Value 编码而不产生科学记数法?