1

私はHaskellにかなり慣れていないので、単純なものが欠けていることを意味していました. 現在、標準入力から JSON を読み込んで、概念実証として AST を取得しようとしています。

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

空の配列であるファイルをテストすると、「代わりに配列に遭遇しました」と表示されます。

したがって、ここである種の変換ステップが欠落しているか、標準入力から誤って読み取っていると推測しています。どう思いますか?

4

1 に答える 1

7

問題は次の行です。

putStrLn value

の型はputStrLnisであるためString -> IO ()、 の型はvalueと推測されるStringため、FromJSON文字列のインスタンスが使用されます。これは文字列のみをデコードします。これは型が処理できるものだからです。他のものをデコードするには、別の型が必要ですvalue

試す

print (value :: JSON.Object)

オブジェクトを期待する場合、または

print (value :: JSON.Value)

JSON 値が受け入れられる場合。

printの代わりに を使用していることに注意してくださいputStrLn。インスタンスprintを持つ任意の型を受け入れるため、それとは異なり、引数を強制的に文字列にすることはありません。また、この例では型注釈がないと機能しないことに注意してください。これは、コンパイラがどの型を持つべきか、したがってどのインスタンスとインスタンスを使用するかを推測するのに十分な情報がないためです。ShowputStrLnprint valuevalueShowFromJSON

于 2014-02-06T14:13:59.993 に答える