
I would just write a parser that picks the fields you want. You could have the parser return a Value but I’d rather collect them in a separate data-structure. For your example, one would have:
flatten :: Value -> Either String Value
flatten
= fmap reencode . parseEither extract
where
extract
= withObject "my obj" $ \o -> do
dv <- o .: "Dimensions"
flip (withObject "dim") dv $ \d ->
liftA2 (,) (o .: "Name") (d .: "W")
reencode :: (Text,Int) -> Value
reencode (n,w)
= object [ "Name" .= n, "W" .= w ]
Now you can map the flatten function over your list of of objects, find out those that were malformed, etc.
On 25 Nov 2014, at 04:41, Stuart Popejoy
Hi,
I'd like to transform some JSON to "flatten" objects in a list to a single dimension. Say I have:
[{ "Name": "Stuart", "Dimensions": { "H": 71, "W": 170 } }, { "Name": "Sam", "Dimensions": { "H": 72, "W": 180 } }]
How do I get it to just
[{ "Name": "Stuart", "W": 170 } }, { "Name": "Sam", "W": 180 } }]
I've tried zipWith with various toListOf constructions to pick apart and rebuild a new JSON object. Is there a better way?
Thanks, Stuart _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe