You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:57:27