2014-02-06 4 views
1

저는 하스켈을 처음 보았 기 때문에 간단한 것을 놓치고 싶었습니다. 지금은 stdin에서 일부 JSON을 읽고 AST를 개념 증명으로 다시 돌려 보려고합니다.Aeson : "문자열을 기대할 때 대신 객체가 발생했습니다"

module JSONStuff where 

import qualified Data.Aeson as JSON 
import qualified Data.ByteString.Lazy.Char8 as Char 

main :: IO() 
main = do 
    input <- Char.getContents 
    case JSON.eitherDecode input of 
     Left err -> putStrLn $ "Bad JSON: " ++ err 
     Right value -> do 
      putStrLn "Got:" 
      putStrLn value 

내가이 JSON 조각이 (JSONLint 말한다하는 괜찮습니다) :

{ 
    "foo": 123 
} 

내가이 프로그램은 입력과 함께, 내가 얻을 때 :

$ cat examples/object.json | runhaskell Main.hs 
Bad JSON: when expecting a String, encountered Object instead 

난에서 테스트 파일이 있고 빈 배열 인 경우 "대신 Array가 발생했습니다"라고 표시됩니다.

그래서 여기에 일종의 변환 단계가 빠져 있거나 표준 입력을 잘못 읽었습니다. 어떻게 생각해? ,

putStrLn value 

putStrLn의 유형 String -> IO()이므로 value의 종류 String로 추정되므로, 문자열에 대한 FromJSON 인스턴스가 사용될 만 스트링을 디코딩한다 :

+1

코드를 SO의 마크 업에 삽입했습니다. 게시물의 '수정'을 클릭하면 어떻게 할 수 있는지 예를 볼 수 있습니다. SO는 코드를 표시하기 위해 각 코드 행 앞에 4 개의 공백을 사용합니다 (코드 다운과 유사 함). 선택적으로 코드 앞에''태그를 추가하여 사용할 구문 강조를 지정할 수 있습니다. 그것은 당신의 코드가 주 태그가 무엇이든간에 강조 표시되어야한다고 추측합니다, 그래서 당신이 haskell 태그에 게시한다면, 그것은 하스켈 구문을 가정 할 것입니다. – bheklilr

+0

감사합니다. 너무 복잡하지는 않지만 실행해야하고 "잘 코드가 컴파일되지 않으므로 문제가 있습니다."라고 말하기를 원하지 않았습니다. :-) – AndrewO

답변

6

문제는이 라인 그 타입이 처리 할 수있는 것이기 때문입니다. 다른 것을 디코딩하려면 value에 대해 다른 유형이 필요합니다.

는 객체를 기대한다면

print (value :: JSON.Object) 

을 시도하거나
print (value :: JSON.Value) 

어떤 JSON 값이 허용되는 경우

.

putStrLn 대신 print을 사용합니다. printShow 인스턴스가있는 모든 유형을 허용하므로 putStrLn과 달리 인수를 문자열로 강제 설정하지 않습니다. 컴파일러가 value 유형을 추론 할 수있는 충분한 정보가 없으므로 및 FromJSON 인스턴스를 사용할 수 없기 때문에 형식 주석이없는 print value은이 예제에서 작동하지 않습니다.

+0

아, 알았어. 나는 또한'putStrLn $ show value'를했을 수도있다. (보푸라기 경고를 받는다.) 이게 더 관용적입니까? – AndrewO

+1

[print가 정의 된 방법입니다] (http://hackage.haskell.org/package/base/docs/src/System-IO.html#print),'print'를 사용하는 것이 더 관용적입니다. – hammar