問題タブ [serde]
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.
json - JSON 配列からキーのサブセットを選択する
次のような出力を吐き出す JSON API を解析しようとしています。
ソース: http://api.open-notify.org/astros.json
私はこれにserdeを使用しており、これまでに次のコードを思い付くことができました:
さて、ppl_value_space
予想通り、これを取得します:
"name"
しかし、本質的に次のようなものを持っているので、私は鍵に到達したいと思います:
現在宇宙にいる宇宙飛行士の名前だけを取得できるように。
なしで"name"
内を取得するにはどうすればよいですか?"people"
"craft"
私はそうしようとしましname
た:
しかし、それはパニックで終わります。これは基本的に、キーがNone
でunwrap()
あることを意味しますOption<T>
。
json - serdeのrustc_serialize::Jsonに相当するものは何ですか?
serde ライブラリはrustc_serialize の代わりになるので、それで動作するようにライブラリをリファクタリングしようとしています。対応するタイプが何であるかわかりませんrustc_serialize::Json
。json を受け入れるメソッドがあるとします。
対応するものは何serde_json
ですか? これですか:
またはこれ:
または、他の何か?
json - serde_json - 構造体を / から json に変換可能にする方法は?
serde_json のドキュメントを見ると、構造体を json にシリアライズ可能およびデシリアライズ可能にするために実装する必要がある特性を理解できません。明白な答えはDeserializer
andかもしれSerializer
ませんが、これらは構造体であり、特性ではありません。
とrustc-serialize
私は実装することができToJson
、FromJson
特性。
json - JSON のフィールドに基づいて JSON を条件付きでデコードする
API から JSON を受信していますが、応答は 30 種類のいずれかになります。各タイプには固有のフィールド セットがありますが、すべての応答には、type
それがどのタイプであるかを示すフィールドがあります。
私のアプローチはserdeを使用することです。応答タイプごとに構造体を作成し、それらをデコード可能にします。それができたら、新しく受信したメッセージに使用する構造体を選択するにはどうすればよいですか?
現時点では、TypeStruct
1 つのフィールドのみを持つ別の構造体を作成しましたtype
。JSON を にデコードし、TypeStruct
型の値に基づいて受信メッセージに適切な構造体を選択し、メッセージを再度デコードします。
このデコードの重複を取り除きたいと思います。
json - serde_jsonでイテレータをエンコードする慣用的な方法は何ですか?
Rust で結果を JSON 文字列としてエンコードしようとしてdrain()
います。vec
これを行うための最良の慣用的な方法は何ですか?
json - エラー: この値の型は、このコンテキストで既知でなければなりません (Rust) / serde_json 値
serde_json を使用して json ドキュメントを逆シリアル化しています。文字列(これはjsonドキュメントです)を指定すると、serde_json値(これはjsonタイプを表す列挙型)を返し、オプションを返す関数があります。この値は、必要に応じて他の関数に渡されます。
ただし、値を渡すことは、私が望んでいるものではないことに気付きました。これを行うと、キーが利用できないためです。
私の要点を説明するために、次のような json ドキュメントがあるとします。
"root" は json オブジェクト、"regex" は json Null、"prefixes" は json 配列です。
ここで、json 型の Value は、json 型を表す識別子を持つ列挙型です。たとえば、上記の例では Object、Null、Array です。
serde_json クレートは std::collections::BTreeMap を使用して json ドキュメント内のノードを表し、String 型は json キーを表します (上記では、これらは「ルート」、「正規表現」、および「プレフィックス」になります。 Values への参照だけでは部分的にしか役に立ちません。キーにもアクセスできるように、代わりに BTreeMap を渡す必要があります。
したがって、これは私が書き直そうとしている次の関数です。
そのため、関数を書き直し始めましたが、「この値の型は、このコンテキストで既知である必要があります」というエラーに直面しました。
このようなスタックオーバーフローに関する他の質問を見つけました: この値のタイプは、このコンテキストで既知である必要があります
これをヘルパーとして使用して、次のように型を挿入しようとしました:
これは問題を解決しません。また、他の同様のバリエーションを試してみましたが、役に立ちませんでした。では、どうすればこれを修正できますか?
編集:
このアプリには次のような別の機能があります。
...そしてこれはうまくいきます。ここでは、as_object() を呼び出して、キーと値をタプル ペアとして取得できることがわかります。as_object があるケースでは機能しているのに、別のケースでは機能していない理由がわかりません。BTreeMap を取り出して、これを借用アイテムとして渡したいと思います。