parsed JSONをJSON::Any
タイプとしてカスタムオブジェクトにマッピングするにはどうすればよいですか?JSON :: AnyをCrystalオブジェクトのカスタムオブジェクトにマップする方法は?
私の場合、私はチャットクライアントに取り組んでいます。チャットAPIは、JSONと次のように要求に応答することができます
{"ok" => true,
"result" =>
[{"update_id" => 71058322,
"message" =>
{"message_id" => 20,
"from" => "Benjamin",
"text" => "hey"}}]}
どこか私のAPIクライアントコード内の私はいくつかの基本的な健康チェックを実行し、応答消費者に結果を渡すためにこれらのJSONを解析します。消費者には、私はresult
以上の配列を反復処理し、適切なオブジェクトにそれぞれの更新を変換しよう:
module Types
class Update
JSON.mapping({
update_id: {type: Int32},
message: {type: Message},
})
end
end
module Types
class Message
JSON.mapping({
message_id: Int32,
date: Int32,
text: String,
})
end
end
return unless response["ok"]
response["result"].each do |data|
update = Types::Update.from_json(data)
end
は残念ながら、最後の行は、コンパイルエラーになり:
no overload matches 'JSON::Lexer.new' with type JSON::Any
どうやら、Object.from_json
だけString
JSONsを受け入れることができますJSONは解析されません。私の場合、data
はJSON::Any
オブジェクトです。
ダーティフィックスTypes::Update.from_json(data.to_json)
が動作しますが、それはうんざりです。
JSONオブジェクトをネストされた構造をすべて保持するカスタムタイプにマップする適切な方法は何ですか?
は、Vitaliiをいただきありがとうございます、そのアプローチは働きました! – vtambourine