2011-10-17 2 views
4

この問題はthis質問に関連しています。ここで再帰的なJSONを解析しようとしていますが、正しい軌道に乗っていますか?

は、私はJSONからにしたいデータ型です:

data ProdObject = MKSpair (Text, Text) 
       | MKSLpair (Text, [Text]) 
       | MKSOpair (Text, ProdObject) 
       | MKObject ProdObject 
       | End 
       deriving Show 

Here私が働いているデータに加えて、全体の一般化のサンプルです。

ここに私のインスタンス定義があり、エラーが発生しています。私はthisを参考にしています。エラーが私のタイプを修正するように指示しているのか、それとも私が邪魔であるのかは分かりません。エラーが本当にまっすぐである場合は、私のタイプを修正する方法についての助言と、他に何が間違っているかもしれないかまだ気づいていないアドバイスが必要です。

ghcifoo> :load test 
[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:23:52: 
    Couldn't match expected type `Value' 
       with actual type `Data.Map.Map Text Value' 
    Expected type: Value 
     Actual type: Object 
    In the first argument of `parseJSON', namely `o' 
    In the second argument of `(<$>)', namely `parseJSON o' 
Failed, modules loaded: none. 

アップデート:ここで

instance FromJSON ProdObject where 
    parseJSON (Object o) = MKObject <$> parseJSON o 
    parseJSON (String s, String t) = MKSpair (s, t) 
    parseJSON (String s, Object o) = MKSOpair (s, MKObject <$> parseJSON o) 
    parseJSON (String s, Array a) = MKSLpair (s, V.toList a) 
    parseJSON (Done d) = End 
    parseJSON _  = mzero 

は、私が今持っているエラーだ私は私が正しい場合、私は幻の種類を持って、私のデータ型をやり直しました。私が間違っている場合は、図面ボードに戻って

data ProdObject = MKSpair (Text, Text) 
       | MKSLpair (Text, [Text]) 
       | MKSOpair (Text, ProdObject) 
       | MKObject ProdObject (k,v) 
       | End 

また、私はこの変更を不完全な方法で反映しています。私はちょうど私が正しい道にいるかどうか尋ねるためにこれを言及する。

parseJSON (Object (k,v)) = MKObject ... 

私が正しい道を歩いているなら、残りの部分を見つけ出すか、少なくとも特定の質問をすることができます。フィードバックは誰ですか?この式で

答えて

1

parseJSON (Object o) = MKObject <$> parseJSON o 

oMap Text Value型を持つが、parseJSONValue -> Parser aを入力しているので、あなたは明らかにoparseJSONを適用することはできません。

はまた、あなたはここで型エラーがあります。

parseJSON (String s, String t) = MKSpair (s, t) 

parseJSONのタイプはValue -> Parser aですが、(Value, Value)照合しようとしています。

同じことが、この行に適用されます。

parseJSON (Done d) = End 

DoneはタイプValueのコンストラクタではありません。


ProdObjectタイプを再帰的にする必要がある理由を理解できませんでした。ここで私は、この問題を解決する方法は次のとおりです。

data Outer = Outer { 
    oName :: Text, 
    oProducts :: M.Map Text Inner 
} deriving Show 

data Inner = Inner { 
    iQA :: Text, 
    iVM :: Text, 
    iAvailable :: V.Vector Text 
} deriving Show 

instance FromJSON Outer where 
    parseJSON (Object o) = Outer <$> o .: "name" <*> o .: "products" 
    parseJSON _ = mzero 

instance FromJSON Inner where 
    parseJSON (Object o) = Inner <$> o .: "qa" <*> o .: "vm" <*> o .: "available" 
    parseJSON _ = mzero 

完全なコードリストはon Githubを見つけることができます。

+0

JSONオブジェクトの外観が間違っていると思います。 –

+0

私は渡されたデータが再帰的に見えるので、再帰的にする必要があると思いました。ソリューションをありがとう! –

関連する問題