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.