私が制御できない API を使用しようとしていますが、これは文書化が不十分で、やや一貫性がありません。これは、API が文書化されているものや通常表示されるものとは異なる型を返す場合があることを意味します。この例では、通常は文字列が表示される場所に配列が返された場合を見ていきます。それはくだらない API になりますが、私の本当の問題は次のとおりです。現在、エラーは次のようになっています。
No usable value for identifier
Do not know how to convert JArray(List(JString(3c8723eceb1a), JString(cba8849e7a2f))) into class java.lang.String
問題を解読した後 ( JValue::toString
JSON 文字列を出力しないのはなぜなのか、非常に困惑しています)、 scase class
のみを処理できるようにしたときに、API が配列を返したことがわかりString
ます。偉大な。私の問題は、オブジェクト モデルと JSON の内容との間の不一致を見つけるのが、本来よりもはるかに難しいように思われることです。
現在、これはデコードエラーを見つけるための私のワークフローです:
- 悪いデータに何らかの識別マーカーがあることを願っています。これが当てはまらない場合は、当て推量であり、不良ビットのように見えるエントリごとに次の手順を繰り返す必要があります。
JArray(List(JString(...), ...))
データを取得した API エンドポイントで JSON を同じ方法でエンコードすることを期待して、エラー メッセージから有効な JSON に変換するという問題を解決します。これが当てはまらない場合は、JSON フォーマッター (jq
) を使用して、すべてのデータを一貫してフォーマットします。- デコード エラーが発生したソース データ内の場所を特定します。
- 配列とオブジェクトをさかのぼって、オブジェクト モデルを変更して、API から返されるデータをより正確に表現する方法を見つけます。
いくつかの背景: 私は C++ から来ており、この目的のために独自の JSON デシリアライゼーション フレームワークを開発しました。私が構築したライブラリを使用した場合の同等のエラーは次のとおりです。
Error decoding value at result.taskInstances[914].subtasks[5].identifier: expected std::string but found array value (["3c8723eceb1a","cba8849e7a2f"]) at 1:4084564
これは、手巻きライブラリを使用するときの私のプロセスです。
std::string
実際に見つかったデータ ( ) と比較して予想されるタイプ ( ) を確認["3c8723eceb1a","cba8849e7a2f"]
し、ソース内のデータのパスのデータ モデルを変更します (result.taskInstances[914].subtasks[5].identifier
)
ご覧のとおり、実際に抱えている問題にすぐに飛びつくことができます。
私の質問は次のとおりです。データ モデルと API から返される結果との間の矛盾をより迅速にデバッグする方法はありますか?
json4s-native_2.10
バージョンを使用して3.2.8
います。
簡単な例:
{ "property": ["3c8723eceb1a", "cba8849e7a2f"] }
Scala とは噛み合わないclass
:
case class Thing(property: String)