Anonymous avatar Anonymous committed 13582f2

Add handling of the leading '_' to 'fromJSON'

So '_'-augmented fields can be not only serialized to JSON but also de-serialized without "field does not exist _Id"-like exception

Comments (0)

Files changed (1)

Data/Aeson/Generic.hs

             remap f = Object . hashMap (f . fromJust . cast) toJSON $ m
 
 
+-- Skip leading '_' in field name so we can use keywords
+-- etc. as field names.
+mungeField :: String -> Text
+mungeField ('_':cs) = pack cs
+mungeField cs       = pack cs
+
+
 toJSON_generic :: (Data a) => a -> Value
 toJSON_generic = generic
   where
         encodeArgs' [] js  = Array . V.fromList $ js
         encodeArgs' ns js  = object $ zip (map mungeField ns) js
 
-        -- Skip leading '_' in field name so we can use keywords
-        -- etc. as field names.
-        mungeField ('_':cs) = pack cs
-        mungeField cs       = pack cs
 
 fromJSON :: (Data a) => Value -> Result a
 fromJSON = parse parseJSON
         -- Select the named fields from a JSON object.
         selectFields fjs = mapM sel
           where sel f = maybe (modFail "parseJSON" $ "field does not exist " ++
-                               f) return $ Map.lookup (pack f) fjs
+                               f) return $ Map.lookup (mungeField f) fjs
 
         -- Count how many arguments a constructor has.  The value x is
         -- used to determine what type the constructor returns.
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.