2016-06-08 5 views
1

의 나는 내가 알고있는 일부 필드와 일부 필드와 JSON 내가 모르는 얻을 가정 해 봅시다 :자리 표시 자

{ 
    "a": { ... }, 
    "b": { ... }, 
    "c": { ... }, 
    "something": "else", 
    "more": {"of": ["the", "same"]}, 
    "and": ["even", "some", "more"] 
} 

을 JSON 구조를 가지 복잡하기 때문에 정말 것 다음 데이터를 사용하여 하스켈 내에서 작업을 좋아한다 :

data A = ... 
data B = ... 
data C = ... 
data MyObject = MyObject 
    { 
    a :: A 
    , b :: B 
    , c :: C 
    , additionalFields :: Object 
    } 

그것이 Aeson.Object로 포장하고 전달 A, B 및 하스켈 개체와 모든 추가 필드로 변환 C 필드를 가질 수 있습니까?

또한 JSON 필드 주문에 대한 어떠한 보증도하지 않습니다.

+0

이유 네가 아는 사람들을 사용하지 않니? – Carsten

+1

내가 할 수 있다면 그렇게하겠다. :) – qwe

답변

5

물론 - 단지 (네 번째 슬롯) additionalFields에서 개체를 저장이 :

instance FromJSON MyObject where 
    parseJSON [email protected](Object v) = MyObject <$> 
     v .: "a"       <*> 
     v .: "b"       <*> 
     v .: "c"       <*> 
     (pure obj) 
    parseJSON _      = mzero 

당신이 a, bc 최초의 키를 제거 할 경우, 사용

import Data.HashMap.Strict as HM 

... 

    pure (HM.delete "a" $ HM.delete "b" $ HM.delete "c" obj)