저는 명령형 프로그래밍 배경에서 오는 하스켈을 처음 사용합니다. 나는 "하스켈 방식"으로 JSON에 객체를 직렬화 할 수 있기를 원하지만, 아직 어떻게해야할지 잘 모르겠다.하스켈 - 동적 JSON 필드로 유형을 모델링하는 방법은 무엇입니까?
나는 JSON에 대해 약간 말한 Chapter 5 of RealWorldHaskell을 읽고 Aeson과 놀았습니다. 에서 매우 기본적인 JSON 문자열을 만들 수 있다는 점에 날 잡았어
: 나는 또한 같은 하스켈로 작성된 몇 JSON의 API 라이브러리를 살펴 보았다 객체 (this blog post에 또한 감사) :
{-# LANGUAGE OverloadedStrings, DeriveGeneriC#-}
import Data.Aeson
import GHC.Generics
data User = User {
email :: String,
name :: String
} deriving (Show, Generic)
instance ToJSON User
main = do
let user = User "[email protected]" "Hello World"
let json = encode user
putStrLn $ show json
출력 할 것이다 :
,536를"{\"email\":\"[email protected]",\"name\":\"Hello World\"}"
목표는 임의의 필드를 가질 수있는 User
인스턴스에 다른 필드를 추가하는 것입니다. Facebook Graph API에는 data
이라는 필드가 있습니다.이 필드는 원하는 모든 속성을 가진 JSON 객체입니다. data
필드가있는 동안,
POST api.facebook.com/actions
{
"name": "read",
"object": "book",
"data": {
"favoriteChapter": 10,
"hardcover": true
}
}
첫 번째 두 개의 필드, name
및 object
유형 String
있습니다 : 예를 들어, 당신은 페이스 북의 API (의사, 정확하게 페이스 북 API에 익숙하지 않은)이 같은 요청을 할 수 있습니다 임의의 프로퍼티의 맵
위의 User
모델에서 달성 할 수있는 "하스켈 방식"은 무엇입니까?
data User = User {
email :: String,
name :: String,
data :: CustomData
} deriving (Show, Generic)
data CustomData = CustomData {
favoriteColor :: String
}
을하지만 내가 찾고 있어요 확실히 어떤되지 않습니다 :
나는 간단한 경우 작업을 수행하는 방법을 이해할 수있다.
{
"email": "",
"name": "",
"data": {
"favoriteColor": ""
}
}
문제는 당신이 그래서 당신은 임의의 필드를 가질 수 있습니다 다음 번에 그 User
유형을 정의해야하고, 어떻게해야합니까입니다 : 즉, User
유형, 직렬화 된 JSON에, 항상이 모양을 의미 정적 유형 지정 (또는 형식의 세부 사항에 익숙하지 않은 익숙하지 않은 곳이면 무엇이든간에)으로부터 여전히 이익을 얻으면서 data
속성에 첨부됩니다.
'어쩌면'과 '모두'를보고 싶습니다. –
http://hackage.haskell.org/package/aeson-0.6.1.0/docs/Data-Aeson.html#g:8 (객체 별칭) –
임의의 데이터 유형으로 정적 유형 지정을 즐기는 것도 불가능합니다. 어떻게 동적 필드를 정적으로 분석 할 수 있습니까? '임의의 데이터'로 기대할 수있는 최선의 방법은 런타임에서 오류가 발생하거나 런타임에 올바르게 가져 오는 것입니다 (예를 들어 Either와 아마도를 통해 가능하지만 여전히 임의적이지는 않습니다). –