or1ko's diary

日々を書きます

JSONの読み込み方法

言語処理100本ノック 2015

言語処理100本ノックの第3章に入るにあたり、JSON形式の読み取り方法について調べた。
標準のライブラリにはないため、別途パッケージが必要で、Googleで検索した限りでは、下記の2つの名前が上がった。

aeson: Fast JSON parsing and encoding | Hackage
json: Support for serialising Haskell to and from JSON | Hackage

この他にもHackageのJSONカテゴリにはいくつもあるが、とりあえず読み込めればよいため、この2つを試した。

要求としては、日本語(UTF8)が処理できて、宣言したdataに取り込めることの2点があるため、
下記の構造を持つJSONデータを読み込み、titleを出力するサンプルを作成することにした。

{
   "title" : "...",
   "text" : "..."
}
Aeson

まずは、Aesonでのサンプル。Aesonのバージョンは0.9.0.1。
下記のプログを参考に作成した。
Parsing JSON with Aeson - School of Haskell | FP Complete

{-# LANGUAGE OverloadedStrings, DeriveGeneric #-}

import Data.Aeson as A
import Control.Applicative
import System.IO.UTF8 as I8
import System.Environment
import Data.Maybe
import Data.ByteString.Lazy.UTF8
import GHC.Generics

data Article = Article {
  text :: String,
  title :: String
} deriving (Eq, Show, Generic)
instance FromJSON Article

main = do
  filename <- head <$> getArgs
  body <- fromString <$> I8.readFile filename
  I8.writeFile "out2.txt" $ title $ fromJust $ A.decode body
json

次に、jsonのサンプルプログラム。バージョンは0.9.1
下記のブロクを参考に作成
Haskell で XML と JSON をパースする方法 - satosystemsの日記

{-# LANGUAGE DeriveDataTypeable #-}
import Text.JSON
import Text.JSON.Generic
import Control.Applicative
import System.IO.UTF8 as I8
import System.Environment

data Article = Article {
  text :: String,
  title :: String
} deriving (Eq, Show, Data, Typeable)

main = do
  filename <- head <$> getArgs
  body <- I8.readFile filename
  I8.writeFile "out.txt" $ text $ decodeJSON body 
まとめ

若干心配していた日本語の扱いもどちらも問題なく、この程度の利用では、利便性はあまり変わらなかった。

ひとまず、Aesonを使用していこうと思う。
調べた限りでは、Aesonのほうが検索のヒットが多く、
また、jsonよりもAesonを薦めている記事があったので。