2013-03-04 2 views
7

나는 Warp (및 Scotty 가능) 및 acid-state를 사용하여 Haskell에서 매우 간단한 CRUD 웹 서비스를 만들고 있습니다.haskell에서 aeson을 사용하여 부분 json 객체 구문 분석

산성 상태에서 사용자 레코드는 Data.Map에 저장됩니다 (예 : this). 나는 그 기록들이 창조 될 때마다 완전 할 것이라는 것을 안다. 그래서 나는 Maybe를 많이 가질 필요가 없다. 그러나 사용자를 업데이트 할 때 클라이언트는 필드 중 일부만 채워진 부분 json 객체를 보내도록 선택할 수 있습니다.

이것을 표현하는 관용적 인 방법은 무엇입니까? MaybeS가없는 FullUser와 모든 선택적 키인 PartialUser 앞에 MaybeS와 정확히 동일한 데이터 선언이 있어야하며 aeson이 자동으로 후자에 대한 인코딩 및 디코딩을 유도하고 마지막으로 유형의 자체 업데이트 함수를 작성합니다. FullUser -> PartialUser -> FullUser?

코드가별로 좋지는 않지만 약간 추한 느낌을 주며 조금이라도 DRY를 위반하는 것처럼 보입니다. 웹 서버에서 이와 같은 공통 작업을 수행해야하므로 아마도 TH로 일반적으로 이미 해결되었습니다.

나는 json 문자열을 저장할 수 있고 항상 누락 된 키가 있는지 확인할 수 있으므로 스키마 변경에 대해 조금 어둡지 만 미래의 증거가 될 수 있지만, 여전히 "유형 안전 "길.

EDIT : 또는 FullUser와 json 문자열에서 간단한 업데이트 기능을 작성하려면 aeson-lens 만 사용해야합니다.

답변

7

관용적 인 하스켈은 가능한 한 많은 정적 검사를 수행하고 있습니다. 동적 점검을 정적 점검으로 대체 할 수 있는지 여부의 관점에서 항상 문제점에 접근해야합니다. 이것이 본질적으로 하스켈에 대한 다음과 같은 진술을 현실에 매우 가깝게 만드는 것입니다 : "컴파일하면 작동합니다". 그래서 분명히 "아니오"일반 JSON 작업.

FullUserPartialUser의 해결책이 맞습니다. UserUserJSON과 같이 다른 이름 지정 방법을 사용하는 것이 좋습니다. 이렇게하면 매우 설명적이고 합리적인 의미를 갖게됩니다.

그러나 Aeson에는 약간의 문제가 있습니다. 생성 된 인스턴스 don't yet support parsing missing fields (제발, 문제에 대한 투표). 따라서 수동으로 인스턴스를 정의해야합니다.

+0

입력 해 주셔서 감사합니다. 그래, 그 이름은 단지 질문을 명확하게하는 것이었다. 이 경우 생성 된 인스턴스로는 충분하지 않으므로 FullUser 및 json 문자열을 사용하고 aeson-lens (그리고 FullUser 용 렌즈)를 사용하여 업데이트하는 업데이트 기능을 사용할 것입니다. – Gurgeh