일부 서지 데이터를 구문 분석하려고합니다. 구체적으로 각 항목의 '제목'필드를 꺼냅니다. 데이터는 JSON이며,이 같은 같습니다Haskell에서 두 가지 유형이 될 수있는 JSON 값을 어떻게 디코딩하나요?
{"rows": [
{"doc":{"sourceResource": {"subject": ["fiction", "horror"]}}},
{"doc":{"sourceResource": {"subject": "fantasy"}}}
]}
모든 항목이 텍스트 또는 [텍스트] 중 하나 인 경우 내가 '주제'를 꺼내 수 있습니다,하지만 난 모두를 수용하는 방법으로 난처한 상황에 빠진거야. 현재 프로그램의 상태는 다음과 같습니다.
{-# LANGUAGE OverloadedStrings#-}
import Debug.Trace
import Data.Typeable
import Data.Aeson
import Data.Text
import Control.Applicative
import Control.Monad
import qualified Data.ByteString.Lazy as B
import Network.HTTP.Conduit (simpleHttp)
import qualified Data.HashMap.Strict as HM
import qualified Data.Map as Map
jsonFile :: FilePath
jsonFile = "bib.json"
getJSON :: IO B.ByteString
getJSON = B.readFile jsonFile
data Document = Document { rows :: [Row]}
deriving (Eq, Show)
data Row = SubjectList [Text]
| SubjectText Text
deriving (Eq, Show)
instance FromJSON Document where
parseJSON (Object o) = do
rows <- parseJSON =<< (o .: "rows")
return $ Document rows
parseJSON _ = mzero
instance FromJSON Row where
parseJSON (Object o) = do
item <- parseJSON =<< ((o .: "doc") >>=
(.: "sourceResource") >>=
(.: "subject"))
-- return $ SubjectText item
return $ SubjectList item
parseJSON _ = mzero
main :: IO()
main = do
d <- (decode <$> getJSON) :: IO (Maybe Document)
print d
아무 도움이됩니다.
편집 :
작업 FromJSON 행 인스턴스 :
instance FromJSON Row where
parseJSON (Object o) =
(SubjectList <$> (parseJSON =<< val)) <|>
(SubjectText <$> (parseJSON =<< val))
where
val = ((o .: "doc") >>=
(.: "sourceResource") >>=
(.: "subject"))
parseJSON _ = mzero
내가주의해야한다 각에서 이러한 유형 약어 표현은 반드시 필요한 것은 아니지만 여기서만 명확하게 나타낼 수 있습니다. 실제 코드에서이를 생략해야합니다. – icktoofay
정말 감사합니다, 이것은 내가 수정을했습니다하지만 내가 필요 정확히 즉 : (SubjectList <$> parseJSON = << val) <|> (SubjectText <$> parseJSON = << 발) – reklak
@reklak : 당신은 생략 할 수 있어야한다 'do' 표기법을 사용하고'let val = ... '대신에'val <- ...'을 쓰면'= <<'이됩니다. – icktoofay