Haskell JSON decode with field-level errors

Haskell
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson (Value (..), eitherDecodeStrict')
import qualified Data.Aeson.KeyMap as KM
import qualified Data.ByteString as B

parsePort :: B.ByteString -> Either String Int
parsePort raw = case eitherDecodeStrict' raw :: Either String Value of
  Left err -> Left ("invalid JSON: " <> err)
  Right (Object o) -> case KM.lookup "port" o of
    Nothing -> Left "$.port: missing required field"
    Just (Number n) -> Right (round n)
    Just _ -> Left "$.port: expected a number"
  Right _ -> Left "$: expected the JSON object"