JSONの読み込み方法
言語処理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を薦めている記事があったので。