2016-12-04 6 views
1

У меня есть данные:FromJSON/ToJSON, когда некоторые поля должны быть разобраны вручную

data MyData = MyData { a :: String, b :: Integer, c :: Bool } 
         deriving (Generic) 

instance FromJSON MyData 
instance ToJSON MyData 

На самом деле, у меня есть еще много полей в MyData.

Я хочу разобрать 1 или 2 поля вручную, так как в MyData они называются несколько иначе, чем в реальном объекте JSON, в то время как еще в состоянии иметь FromJSON и ToJSON или что-то подобное. Является ли это возможным? Или я должен в этом случае разобрать все поля вручную и не использовать FromJSON/ToJSON?

+1

Релевантно: [Parse JSON с именами полей, которые содержат зарезервированные ключевые слова] (http://stackoverflow.com/questions/18410686/parse-json-with-fieldnames-that-contain-reserved-keywords) – duplode

ответ

2

Вы хотите взглянуть на шаблон Haskell deriving abilities of aeson. Там есть опция, которая поможет вам переименовать поля. Например, сказать, что я хочу, чтобы переименовать color поле для colour в следующей декларации:

data MyData = MyData { address :: String 
        , streetNumber :: Integer 
        , isApartment :: Bool 
        , color :: String 
        } 

Затем, вместо получения Generic, я добавил следующие

{-# LANGUAGE TemplateHaskell #-} 
import Data.Aeson.TH 

data MyData = MyData { address :: String 
        , streetNumber :: Integer 
        , isApartment :: Bool 
        , color :: String 
        } 

$(deriveJSON defaultOptions{ 
    constructorTagModifier = \f -> if f == "color" then "colour" else f 
    } ''MyData) 

Тогда мои ToJSON и FromJSON экземпляры имеют соответственно названные поля.

+0

, кстати, есть существует способ создания списка «импорт» или «импорт» с шаблоном haskell, поэтому он компилируется так, как будто я должен добавлять их вручную? – Orado

+0

@ Орадо Не то, чтобы я знал. Может быть, у кого-то будет идея для этого. – Alec

+0

в порядке. возможно ли не анализировать все поля в реализации «FromJSON», а только те, которые я хочу, потому что другие не имеют значения для меня? – Orado