2017-04-25 3 views
0

に値を確定するためのキーの機能を指定するIは、単純なマップ、example-mapあると仮定:clojure.data.json /ライトSTR:集約アレイ

(def example-map {"s" {"f" "g"} 
        "m" {"r" "q"}}) 

を私はJSON-IFYこのマップにclojure.data.json/write-strを使用することができそのようなもの:

(clojure.data.json/write-str example-map) => 
"{\"s\":{\"f\":\"g\"},\"m\":{\"r\":\"q\"}}" 

条件付きで値の一部をキーの値に従ってリストに配置したいと思っています。

write-strはオプションの:key-fnを提供します。これは、キー値のペアにいくつかの機能を適用します。たとえば、目的の関数は、"s"に一致するエントリに関連付けられたすべての値がリストに配置されるように指定できます。

(clojure.data.json/write-str example-map :key-function desired-function) => 
"{\"s\":[{\"f\":\"g\"}],\"m\":{\"r\":\"q\"}}" 

誰もがセットでキーの加盟をチェックし、出力JSONでレンダリングされた配列にメンバーに関連付けられた値を置くようなキーの機能を指定する方法を知っていますか?

答えて

1

これまでの質問と同様、これはJSONパーサーの仕事ではありません。 JSONマップの形状を調整するために、JSONライブラリの書き込み時機能に依存する必要はありません。代わりに、完全に機能するチューリング完全言語を使い分けてください:Clojure!マップを出力したいと思わない場合は、1つのClojureマップを入力とし、別のものを出力として生成する関数を記述します。出力を操作する特別なルールを使わずに、出力マップを記述するようにJSONライブラリに依頼してください。それは、この特定のJSONライブラリを起こるように(あなたが主張するようではないkey-function

は今、は、あなたがそのキーに基づいてマップ内の値を変更できるようにvalue-fnという名前のオプションを提供しません。あなたは、このような関数を書くこともできますが、それらはすべて、完全にあなたのJSONパーサから離婚されている多くの方法があります

(fn [k v] 
    (...compute new value...)) 

:だから、あなたは、単にのように署名を持つ関数を記述する必要があり、その場合には、ことを使用することができます。あなたがそれを書くのを助ける必要があるなら、あなたが助けを必要とするいくつかの特定の事柄について言及してください、あなたは実際にあなたにトラブルを与えているプロセスの部分について明確な説明を得ることができます。

+0

助けてくれてありがとう、@amalloy! –