REST 서버에서 복잡한 형식의 JSON 응답을 사용하고 있습니다. 그것들을 디코딩하기 위해 서로 다른 중첩 된 객체를 다루기 위해 몇 가지 데이터 유형이 있습니다. 예 :Aeson은 문자열 또는 int 일 수있는 JSON 객체를 디코딩합니다.
... Other types ...
data Profile =
Profile { fields :: [KVPair]
} deriving (Show)
instance FromJSON Profile where
parseJSON (Object v) =
Profile <$> v .: "Fields"
parseJSON _ = mzero
data KVPair =
KVPair { key :: Int
, value :: String
} deriving (Show)
instance FromJSON KVPair where
parseJSON (Object v) =
KVPair <$> v .: "Key"
<*> v .: "Value"
parseJSON _ = mzero
최종 KVPair 유형을 제외한 모든 기능이 작동합니다. 내 JSON 객체에는 모두 정수 키가 있습니다. 그러나, 값은 정수 또는 문자열이 될 수 있습니다 :
{
"Key": 0,
"Value": "String Value!"
},
{
"Key": 1,
"Value": 42
}
지금 내가 String
과 Int
구성되어 내 값 디코딩에 다른 합계 유형을 추가 할 수도있을 것 같군요,하지만 나는 전체를 추가하지 않도록하는 것을 선호 그저 새로운 유형입니다. Aeson은이 시나리오를 처리하는 간단한 방법이 있습니까?
대체 구문 분석 메소드를 올바르게 이해하면 정수 값을 문자열 유형으로 강제 변환 할 수 있습니까? 따라서 "Value": 3은 KVPair {value = "3"}와 같은 것으로 변환됩니까? – jkeuhlen
@jkeuhlen 정확히 말하자면 "강제 변환"은 여기에 적용되지 않는 하스켈의 특정한 의미를 가지고 있습니다 - "변환"또는 "예쁘게 인쇄"가 더 정확할 것입니다. –