5

nameJSONオブジェクトを解析し、指定されたおよびでJSONEventを作成したいargs

私は Aeson を使用していますが、現在"args":[{"a": "b"}][(String, String)].

前もって感謝します!

{-# LANGUAGE OverloadedStrings #-}

import Control.Applicative
import Data.Aeson

data JSONEvent = JSONEvent [(String, String)] (Maybe String) deriving Show

instance FromJSON JSONEvent where
  parseJSON j = do
    o <- parseJSON j
    name <- o .:? "name"
    args <- o .:? "args" .!= []
    return $ JSONEvent args name

let decodedEvent = decode "{\"name\":\"edwald\",\"args\":[{\"a\": \"b\"}]}" :: Maybe JSONEvent
4

2 に答える 2

3

私は aeson の専門家ではありませんが、 をお持ちObject oの場合、oは単にHashMap Text Value; です。Data.HashMap.Lazy.toListを使用して に変換し[(Text, Value)]Data.Text.unpackを使用してTexts をs に変換できますString

したがって、おそらく次のように書くことができます。

import Control.Arrow
import Control.Applicative
import qualified Data.Text as T
import qualified Data.Foldable as F
import qualified Data.HashMap.Lazy as HM
import Data.Aeson

instance FromJSON JSONEvent where
  parseJSON j = do
    o <- parseJSON j
    name <- o .:? "name"
    Object m <- o .:? "args" .!= []
    args <- map (first T.unpack) . HM.toList <$> F.mapM parseJSON m
    return $ JSONEvent args name
于 2012-01-06T16:36:14.880 に答える