問題タブ [argonaut]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - JSON構造に基づいてArgonautで封印された特性をデコードしますか?
次の例を考えます。
適切な構造を持つオブジェクトをデコードするCodecJson
forを記述する必要があります。Id
spray-json
何らかの種類の識別子フィールドを追加することは、これに対する一般的な提案ですが、既に生成/消費している JSON を変更したくありませんjson4s
。
これらのライブラリでは、エンコーダー/デコーダーは基本的にPartialFunction[JValue, A]
とPartialFunction[A, JValue]
. 値がドメインで定義されていない場合、それは失敗です。これは本当にシンプルでエレガントなソリューションだと思います。それに加えて、JSON タイプのエクストラクタがあるため、フィールド/構造でオブジェクトを簡単に一致させることができます。
Rapture はさらに一歩進んで、フィールドの順序を重要ではなく、一致しないフィールドの存在を無視するので、次のようにすることができます。
それは本当にシンプル/強力です。
で同様のことを行う方法がわかりませんargonaut
。これは私がこれまでに思いついた最高のものです:
そのため、いくつかの問題があります。使用する予定のない追加のコーデックを定義する必要があります。EncodeJson
forで case-class エクストラクタを使用する代わりに、CodecJson[Id]
定義した他のエンコーダに委任しています。ただ、フィールドが 2 つまたは 3 つしかないクラスでは、あまり単純でもきれいでもありません。
このセクションのコードDecodeJson
もかなり厄介です。ifEmpty
の側に追加の型キャストがあることを除けばfold
、 のコードと同じですDecodeJson.|||
。
誰かが、ディスクリミネーターを必要とせず、代わりにjsonの構造に一致できるアルゴナウトでSumタイプの基本的なコーデックを書くためのより慣用的な方法を持っていますか?
scala - `circe` 型レベル Json => 関数?
circe
orを使用してargonaut
、どのように書くことができますかJson => A
(注 -Json
型の名前ではないかもしれません) whereA
はSSN
クラスによって与えられます:
?
擬似コード:
// assuming this function is named f
f(JsArray(JsNumber(1)))
A
サイズが 1 であるため、にはなりませんが、
f(JsArray(JsNumber(1), ..., JsNumber(8)))
===SSN(SizedList(1,...,8))
json - Argonaut または Circe を使用して不完全な JSON からケース クラスを更新する
DecodeJson
不完全な json (一部のフィールドが欠落している) が与えられた場合、ケース クラス インスタンス (必要な s が暗黙的に派生したもの) から更新されたインスタンスを作成する必要があります。これは、Argonaut (できれば) または Circe (必要な場合) でどのように達成できますか?
例:
json を json AST に解析し、それを Shapeless に変換してからLabelledGeneric
、何らかの方法で Shapeless update を使用してケース クラス インスタンスを更新する必要があると確信しています。
編集 2
Shapeless ソースを読んだ後、独自の「デフォルト」オブジェクトを生成できることがわかりました。JSONの解析中にケースクラスのインスタンスが存在することを必要とするソリューションを作成することができました。これを回避し、代わりにインスタンスを後で提供することを望んでいました。とにかくここにあります:
これにより が得られPerson(Old Name Kept,42)
ます。
json - Argonaut: 多相配列のデコード
私が書き込もうとしている JSON オブジェクトにDecodeJson[T]
は、さまざまな「タイプ」の配列が含まれています (つまり、その要素の JSON 構造はさまざまです)。唯一の共通点はtype
、タイプを区別するために使用できるフィールドです。他のすべてのフィールドは異なります。例:
Arnaut を使用して、JSON 配列を Scala にマップすることは可能 ですか?ここでSeq[Element]
、 typeなどElement
の適切なケース クラスのスーパータイプです。ElementA
ElementB
私は で同じことをしplay-json
ましたが、それは非常に簡単でした (基本的にReads[Element]
、フィールドを評価し、type
それに応じてより具体的な に転送するa Reads
)。しかし、アルゴノートでこれを行う方法が見つかりませんでした。
編集:例
Scala タイプ (使用したい):
JSON インスタンス (私の管理下にありません):
scala - akka `HttpResponse` を Argonaut `Json` としてマーシャルする
私はakkaHttpResponse
を次のようにマーシャリングしようとしています:
このインスタンスの Argonaut を作成すると、次のEncodeJson
ようになります。
ヘッダーをjsonとしてマーシャリングすることができました。唯一の問題は本体、つまりResponseEntity
. これは akka ストリームなので、使用すると未来しか返されません.toStrict
。
どのようにマーシャリングするかについて誰かが私を導くことができますか?
purescript - Affjax Respondeable のための Purescript 再利用 Argonaut JSON デコード
Haskell サーバーから JSON データをフェッチしようとしていますが、Respondeable インスタンスだけでなく、一般的な Affjax にも問題があります。EncodeJson + DecodeJson を Data.Argonaut.Generic.Aeson (GA) で定義しましたが、それを Respondeable インスタンスに適合させる方法がわかりません。それは fromResponse 関数です。
「Foreign 型と Json 型を一致させることができませんでした」というエラーが表示されますが、手動で何かを作成しなくても、decodeJson インスタンスを再利用できますか? おそらく IsForeign インスタンスを作成することによって、しかしその中で GA.decodeJson を使用することでしょうか? どうすればいいのかわかりません。https://github.com/purescript/purescript-foreign/blob/master/examples/Complex.pursで手動で行う方法を見てきましたが、Haskell JSON 出力と一致させる必要がある複雑な型があります。手動で行うのは非常に面倒です。
私は purescript 10.7、Affjax 3.02、Argonaut 2.0.0、Argonaut-generic-codecs 5.1.0 を使用しています。ありがとう!