Haskell如何缩进格式化输出JSON文件生成人类易读结果
Haskell 实现JSON缩进格式化输出的方法
Haskell 原生支持输出带缩进、换行的人类可读JSON,你当前使用的aeson库已经内置了该能力,无需借助外部格式化工具。
你当前输出单行无格式JSON的原因是:aeson默认的encode、encodeFile函数面向机器传输场景做了优化,会移除所有不必要的空白字符输出最小化JSON,本身就不适合人工阅读。要输出格式化的JSON,仅需做两处修改:
- 导入aeson内置的美化编码模块:
import Data.Aeson.Encode.Pretty (encodePretty) - 替换原有写入逻辑:移除直接调用
encodeFile的写法,改用encodePretty将待输出的JSON值序列化为带缩进、换行的格式化字节串,再写入目标文件即可。
encodePretty默认采用2空格缩进,会自动为对象字段、数组元素添加换行,按层级做缩进对齐,完全满足人工查看校验的需求。如果需要自定义缩进宽度、键排序规则、换行策略,也可以使用同模块下的encodePretty'函数传入自定义配置实现。
修改后的完整可运行代码如下:
{-# LANGUAGE DeriveGeneric #-} module Main (main) where import System.IO import Data.Aeson import Data.Aeson.Encode.Pretty (encodePretty) import GHC.Generics import Control.Monad import System.Environment import qualified Data.ByteString.Lazy as B getJSON :: IO B.ByteString getJSON = B.readFile "input.json" data Person = Person { idnum :: Integer, height :: Integer, weight :: Integer } deriving (Show, Generic) instance ToJSON Person instance FromJSON Person data AfterMarathonPerson = AfterMarathonPerson { person :: Person, weightLoss :: Integer } deriving (Show, Generic) instance ToJSON AfterMarathonPerson marathonEffect :: Person -> AfterMarathonPerson marathonEffect (Person i h w) = AfterMarathonPerson (Person i h w) (w-23) main = do marathon <- (eitherDecode <$> getJSON) :: IO (Either String [Person]) case marathon of Left jsonReadError -> putStrLn jsonReadError Right runners -> B.writeFile "output.json" $ encodePretty $ map marathonEffect $ runners
注意:
Data.Aeson.Encode.Pretty是aeson包自带的模块,不需要额外添加第三方依赖,只要原有代码可以正常编译,添加上述导入后即可直接编译运行。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

