@@ -263,14 +263,23 @@ jsonDecls g p (Map.toList -> rs) = [from, to]
263263 ]
264264
265265 decode (l, s)
266+ | _additional s = app (var "parseJSON") (app (var "Object") (var "o"))
266267 | Just x <- def s = defJS l x
267268 | required s = reqJS l
268269 | monoid s = defJS l (var "mempty")
269270 | otherwise = optJS l
270271
271− to = InstDecl noLoc Nothing [] [] (unqual "ToJSON") [tycon g]
272− [ wildcardD "toJSON" g omit none (map encode rs)
273− ]
272+ to = case rs of
273+ [(k, v)] | _additional v ->
274+ InstDecl noLoc Nothing [] [] (unqual "ToJSON") [tycon g]
275+ [ funD "toJSON" $
276+ infixApp (var "toJSON") "." (var (fname p k))
277+ ]
278+
279+ _ ->
280+ InstDecl noLoc Nothing [] [] (unqual "ToJSON") [tycon g]
281+ [ wildcardD "toJSON" g omit none (map encode rs)
282+ ]
274283
275284 omit = app (var "object")
276285 . app (var "catMaybes")
@@ -420,13 +429,17 @@ externalType = \case
420429 TMaybe t -> TyApp (TyCon "Maybe") (externalType t)
421430 TList t -> TyList (externalType t)
422431 TLit l -> externalLit l
432+ TMap k v ->
433+ TyApp (TyApp (TyCon "HashMap") (externalType k)) (externalType (require v))
423434
424435internalType :: TType -> Type
425436internalType = \case
426− TType r -> tycon r
427− TMaybe t -> TyApp (TyCon "Maybe") (internalType t)
428− TList t -> TyList (internalType t)
429− TLit l -> internalLit l
437+ TType r -> tycon r
438+ TMaybe t -> TyApp (TyCon "Maybe") (internalType t)
439+ TList t -> TyList (internalType t)
440+ TLit l -> internalLit l
441+ TMap k v ->
442+ TyApp (TyApp (TyCon "HashMap") (internalType k)) (internalType (require v))
430443
431444externalLit :: Lit -> Type
432445externalLit = \case
@@ -490,6 +503,10 @@ iso = \case
490503 TLit DateTime -> Just (var "_DateTime")
491504 _ -> Nothing
492505
506+require :: TType -> TType
507+require (TMaybe t) = t
508+require t = t
509+
493510strict :: Type -> Type
494511strict = TyBang BangedTy . \case
495512 t@TyApp{} -> TyParen t