2012-07-05 3 views
1

하스켈에서 내 퍼시스턴스 시스템의 일부로 데이터 구조를 JSON 형식으로 변환 한 다음 쓰는 중입니다. 디스크에. 나중에 파일을 읽고 JSON 파서를 통해 파일을 실행하여 객체를 다시 구성하여로드하려고합니다.Haskell에서 파일에서 읽은 문자열을 구문 분석하기 위해 Text.JSON을 사용하는 방법

그러나 JSON 모듈이 문자열을 구문 분석하지 못하게하는 읽기 부분에서 문제가 발생합니다.

먼저 Text.JSON (json-0.5)을 사용하고 있습니다. 내가 파일에 쓰고 데이터 유형은 WorkoutEvent라고하며, 나는 그것이 인코딩 완벽하게이 명령을 사용하여 JSON을 디코딩 것을 확인했다 :

decode $ encode evt :: Result WorkoutEvent 

그래서 염두에두고, 나는이 사건의 무리를 만들고 (내 텍스트 편집기에서 열 때) 파일에 기록하고, 결과 파일은 다음과 같습니다

{"type":"AddWorkout","data":{"uuid":"473b7964-8197-49ac-be3b-2b3804f1fbb5","date":"2012-03-30","workout_type":"Pushups","description":"","sets":[6]}} 
{"type":"AddWorkout","data":{"uuid":"9f83363a-5298-4778-9c80-7dfa0d2ea6f9","date":"2012-04-02","workout_type":"Pushups","description":"","sets":[6,6]}} 
{"type":"AddWorkout","data":{"uuid":"a60806a0-efd6-4647-bc62-a48298ce55cd","date":"2012-04-04","workout_type":"Pushups","description":"","sets":[]}} 

그리고 정도에 등등. 파일의 각 행은 내가 직렬화 한 하나의 완전한 객체를 나타냅니다.

는 그럼 난에서 ReadFile을 사용하여 파일을로드하고 난 아무런 문제가 볼 :

*Main> f <- readFile "/home/savanni/Documents/workouts.json-stream" 
*Main> take 50 f 
"{\"type\":\"AddWorkout\",\"data\":{\"uuid\":\"473b7964-8197" 
*Main> putStrLn $ take 50 f 
{"type":"AddWorkout","data":{"uuid":"473b7964-8197 

지금까지 너무 좋아. 내가 putStrLn f 내가 출력을 볼 어디서나 출력에는 \ 시퀀스가 ​​없음을보고 말한다면

*Main> decode f :: Result [WorkoutEvent] 
Error "Invalid tokens at end of JSON string: \"{\\\"type\\\":\\\"A\"" 

: 나는 데이터를 디코딩 할 때 캐치 온다. 명령 줄에 f을 입력하면 위와 같은 이스케이프 시퀀스가 ​​표시되지만 아무 곳에서도 여러 개의 \ 이스케이프 시퀀스가 ​​표시되지 않습니다.

그래서 결국 정확히 Text.JSON 모듈을 사용하여 파일에서 JSON 데이터를 읽어야합니까?

답변

3

각 행은 유효한 JSON이지만 전체 파일은 아니므로 한 줄씩 디코딩해야합니다. 뭔가 (테스트되지 않은) :

map (decode :: String -> Result WorkoutEvent) $ lines f 
+1

머리 -> 책상. 그게 정확히 맞는 것입니다. 감사. –

관련 문제