我没有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是文件名),但听起来像一个非常差的方法。
感谢。
答案 0 :(得分:2)
当您不控制data
定义并且您对要解析的格式有严格要求时,最好明确地编写(反)序列化程序。
如果需要外部信息来完全构造值,请避免使用FromJSON
/ ToJSON
类型类,只需编写独立解析器。
aeson 的派生机制更适合与自己对话的应用程序(因此只关心parseJSON
和toJSON
之间的往返),或者在定义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'