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

时间:2018-04-20 15:40:14

标签: haskell aeson

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

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

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

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

我的想法是定义另一个data,如NotNamedObservation,初始化它,然后有一个转换NotNamedObservation -> String -> Observation的函数(其中String是文件名),但听起来像一个非常差的方法。

感谢。

2 个答案:

答案 0 :(得分:2)

当您不控制data定义并且您对要解析的格式有严格要求时,最好明确地编写(反)序列化程序。

如果需要外部信息来完全构造值,请避免使用FromJSON / ToJSON类型类,只需编写独立解析器。

aeson 的派生机制更适合与自己对话的应用程序(因此只关心parseJSONtoJSON之间的往返),或者在定义JSON格式或Haskell类型方面具有灵活性。

如果由于某种原因仍然需要使用这些类,一个选项当然只是将undefined放在那些缺少的字段中。要更多地依赖类型系统,您还可以通过&#34;阶段&#34;来参数化类型。 (这又假设您可以调整数据类型),这是一个包装某些字段的类型构造函数。

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

-- This is isomorphic to the original Observation data type
type Observation = Observation Identity

-- When we don't have the filename available, we keep the field empty with Proxy
instance FromJSON (Observation' Proxy) where
  ...

mkObservation :: FileName -> Observation' Proxy -> Observation

答案 1 :(得分:1)

只需将您的实例设置为从文件路径到观察的功能:

'title' => 'required|max:100|unique:categories,title,user_id'