2016-07-08 9 views
1

{"format": {"format_name": value}} 형식의 JSON으로 value을 추출하는 ffprobe 주위에 래퍼를 작성하려고합니다. JSON은 생성 된 프로세스에 의해 출력됩니다. 여기에 내가 얻은 것이있다.Text.JSON을 사용하여 데이터 추출하기

import System.Process 
import System.Environment 
import System.IO 
import Text.JSON 

main = do 
    args <- getArgs 
    (_, Just out, _, p) <- createProcess 
     (proc "ffprobe" [args!!0, "-of", "json", "-show_format"]) 
     { std_out = CreatePipe } 
    s <- hGetContents out 
    --putStrLn $ show (decode s :: Result JSValue) 
    --waitForProcess p 
    --putStrLn $ valFromObj "format_name" format 
    -- where format = valFromObj "format" rootObj 
    --   (Ok rootObj) = decode s :: Result (JSObject (JSValue)) 
    let (Ok rootObj) = decode s :: Result (JSObject (JSValue)) 
    let (Ok format) = valFromObj "format" rootObj :: Result (JSObject (JSValue)) 
    putStrLn format_name 
     where (Ok format_name) = valFromObj "format_name" format 
그것은 함께 컴파일에 실패

: 내가 컴파일 할 마지막 줄을 얻을 수없는 이유 등 여러 가지에 대해 혼란 스러워요

[1 of 1] Compiling Main    (ffprobe.hs, ffprobe.o) 

ffprobe.hs:20:59: error: 
    Variable not in scope: format :: JSObject JSValue 

:

  1. 왜 수 있습니다 ' 나는 Ok에 대해 에 :: 뒤에 주장한다. :: Result Ok JSObject JSValue처럼?
  2. where 절에서 값을 추출 할 수없는 이유는 무엇입니까?
  3. 이유는 Result (JSObject (JSValue))이고 Result JSObject JSValue이 아닌 이유는 무엇입니까?
  4. format이 범위를 벗어 났습니까?

나는 IO와 결과 모나드를 함께 모으는 느낌이 들었다. do 블록이나 뭐. Result도 모나드입니까? IOdo 전체를 골라 가지 않고 원하는 값을 추출 할 수 있습니까? do?

+0

JSON을 해독하려는 경우가 아니라면 [aeson'] (https://hackage.haskell.org/package/aeson-0.11.2.0/)에 대한 인기있는 Haskell 라이브러리가 있다는 것을 알고있을 것입니다. docs/Data-Aeson.html)? – Alec

답변

2

귀하의 컴파일 오류는 where의 위치 때문에라고 생각합니다. where의 범위는 do 밖에

main = do 
    ... 
    let (Ok format) = valFromObj "format" rootObj :: Result (JSObject (JSValue)) 
    let (Ok format_name) = valFromObj "format_name" format 
    putStrLn format_name 

은 그래서 format 인식하지보십시오.

1

당신은이 작업을 수행 할 수 없습니다

main = do 
    let bar = "only visible inside main? " 
    return baz 
    where 
    baz = bar ++ " yes, this will break!" 

이 제공 :

test.hs:7:11: 
    Not in scope: ‘bar’ 
    Perhaps you meant ‘baz’ (line 7) 

이 함수 인수는 달리 바인딩을하자 어디 바인딩에서 사용할 수 없습니다. bar 위는 baz을 사용할 수 없습니다. 귀하의 코드와 비교하십시오.