在JSON解析中使用文件名(Haskell Aeson)

Vit*_*rqb 5 haskell aeson

我没有在Haskell的经验。我正在尝试.json使用aeson将许多文件解析为Haskell中的数据结构。但是,由于无法控制的原因,我需要将解析数据的文件的名称存储为数据中的字段之一。我到目前为止拥有的一个简单示例是:

data Observation = Observation { id :: Integer
                               , value :: Integer
                               , filename :: String}

instance FromJSON Observation where
  parseJson (Object v) =
    Observation <$> (read <$> v .: "id")
                <*> v .: "value"
                <*> ????
Run Code Online (Sandbox Code Playgroud)

我的问题是:解析可访问文件名的json文件时,能够序列化数据的智能方法是什么?

我想到的是定义另一个datalike NotNamedObservation,将其初始化,然后具有一个转换函数NotNamedObservation -> String -> Observation(其中String是文件名),但这听起来很糟糕。

谢谢。

Tho*_*son 2

只需使您的实例成为从文件路径到观察的函数即可:

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import qualified Data.ByteString.Lazy as LBS
import System.Environment

data Observation = Observation { ident    :: Integer
                               , value    :: Integer
                               , filename :: FilePath
                               } deriving (Show)

instance FromJSON (FilePath -> Observation) where
  parseJSON (Object v) =
    do i <- read <$> v .: "id"
       l <- v .: "value"
       pure $ Observation i l

main :: IO ()
main = do
  files <- getArgs
  fileContents <- traverse LBS.readFile files
  print fileContents
  let fs = map (maybe (error "Invalid json") id . decode) fileContents
      jsons :: [Observation]
      jsons = zipWith ($) fs files
  print jsons
Run Code Online (Sandbox Code Playgroud)