haskell-jp / questions #100 at 2022-03-22 16:47:57 +0900

aesonのparseJSONするときにファイルに書かれている設定値を使いたいのですが、
parseJSON :: Value -> Parser a
こんな関数なのでできないですよね。
一度parseJSONしたあとに他でやるしかないですかね。
他のファイルに書いてある設定値によってパース方法を変えたいってことですか?であればreflectionパッケージを使ってこんな感じに書くのがいいと思います:
instance Given OtherFileContents => FromJSON ConfigFromJson where
  parseJSON = withObject "ConfigFromJson" $ \o ->
    -- ...
   where
    otherFileContents = given
端的でちょっと何をしたいのかよく分からないのですが、私はいわゆる設定ファイルには、
loadYamlSettings
を使って、環境変数なども参照するようにしています。
「設定値」とは何ですか?定義と実例を見たいです
あるファイルA.jsonに
• hoo1
◦ hoo12
• hoo2
◦ hoo23
• hoo3
◦ hoo34
というのがあって、
ファイルB.jsonがあって、
ある項目にhoo1というのがあったら
hoo12に置き換えるようなことをやりたいです。
ファイルA.jsonが設定値にあたります。
それでhoo1,hoo2,hoo3以外のものがファイルB.jsonにあった時点(行)で
エラーを出したいです。
なるほど。これはaesonパッケージが担当する問題ではないので、まずA.jsonを`Map Text Value`としてデコードし、一括で置換を行う関数 Map Text Value -> Value -> Valueを定義するというアプローチが考えられますが、`parseJSON`内で置換することや、型によって挙動を変えることにこだわりがあるならigrepさんの方法が使えます
出来なくはない気がしますが、他の方の意見と同じく、一度両方を読み込んで置換した方が良いと思いますね。

それでhoo1,hoo2,hoo3以外のものがファイルB.jsonにあった時点(行)で
エラーを出したいです。
については、
parseJSONの内部で想定してないキーが来たら prependFailure などを呼び出す、
方法などがあると思います。
reflectionパッケージがあっている気がします。
ありがとうございます。