2016-06-08 1 views
1

Disons que je reçois un JSON avec des champs que je connais et certains domaines, je ne sais pas:Placeholder pour les champs supplémentaires avec Data.Aeson

{ 
    "a": { ... }, 
    "b": { ... }, 
    "c": { ... }, 
    "something": "else", 
    "more": {"of": ["the", "same"]}, 
    "and": ["even", "some", "more"] 
} 

Puisque la structure JSON est un peu compliqué, je voudrais vraiment aiment travailler avec elle au sein de Haskell en utilisant les données suivantes:

data A = ... 
data B = ... 
data C = ... 
data MyObject = MyObject 
    { 
    a :: A 
    , b :: B 
    , c :: C 
    , additionalFields :: Object 
    } 

est-il possible d'avoir les champs a, b et c traduit à des objets Haskell et tous les champs supplémentaires soient emballés et transmis en tant Aeson.Object?

Aussi, je n'ai aucune garantie de l'ordre des champs JSON.

+0

pourquoi n'utilisez-vous pas ceux que vous connaissez? – Carsten

+1

Je voudrais, si je le pouvais. :) – qwe

Répondre

5

Bien sûr - il suffit de stocker l'objet dans additionalFields (la quatrième fente):

instance FromJSON MyObject where 
    parseJSON [email protected](Object v) = MyObject <$> 
     v .: "a"       <*> 
     v .: "b"       <*> 
     v .: "c"       <*> 
     (pure obj) 
    parseJSON _      = mzero 

Si vous voulez supprimer les clés pour a, b et c d'abord, puis utilisez:

import Data.HashMap.Strict as HM 

... 

    pure (HM.delete "a" $ HM.delete "b" $ HM.delete "c" obj)