現在、私のアプリケーションに入ってくるjsonオブジェクトのストリームを扱っています。それらを解析する最善の方法が何であるかを理解することがいくつか困難です。ストリームは、定義された型を持つオブジェクトで構成されます。問題は、オブジェクト内のフィールドの1つがタイプを変更することです。変更するタイプのストリームを構造体にアンマーシャリングする
[{
"status": "closed",
"type": "transaction",
"transaction": {
"TransactionType": "TypeA",
"Account": "Some string",
"Fee": "14",
"date": 45325680
},
"validated": true
},
{
"status": "closed",
"type": "transaction",
"transaction": {
"TransactionType" : "TypeB",
"Account" : "Some string",
"Fee": "42",
"Destination" : "Some string"
},
"validated": true
}]
「親」は変更されていませんが、「トランザクション」は変更されていないことがわかります。私は説明しやすくするために "トランザクション"フィールドから多くのフィールドを削除しましたが、これは10-ish共通フィールドとそのタイプに依存する10-ish変更フィールドを持つタイプです。また、10種類のトランザクションタイプがあります。これは、すべてを1つの構造体に入れて、オプションのフィールドをたくさん持っていることをかなり面倒にしています。私はまた、トランザクションの種類ごとに1つの構造体について考えていましたが、これは機能しません。なぜなら、フィールドがどの型を親に持つべきかを指定する方法がないからです。
これらのオブジェクトを効果的に解析するにはどうすればよいですか?残念ながら、私はストリームから出てくる要素の構造を変更することはできません。これを解決する最良の方法は何でしょうか?
異なるオブジェクトタイプの配列を持つ[Gson Parse Json]の可能な複製(https://stackoverflow.com/questions/14713736/gson-parse-json-with-array-with-different-object-types) –
' TransactionType'はまだ文字列です。私は、 'transaction'構造体のどのフィールドが重要であるかを伝えるために使われていると思います。これは、可能なすべてのフィールドの信頼できるリストが存在し、トランザクションのタイプに基づいたフィールドを含むか含まないことを意味します。あなたは何を試しましたか、なぜそれは機能しませんでしたか? – Marc
修正。問題は、そのような構造をアンマーシャリングする最も効率的な方法が何であるかを理解できない(またはわかりません)ということです。私は実際に、例えば 'RawMessage'のcontainsを使ってトランザクションフィールドをアンマーシャリングする方法を見つけ出すことができますが、どこにこの結果を置くのですか? "親"構造体にはトランザクションの種類ごとにフィールドが必要ですか?あるいは、私は 'interface {}'型のフィールドと "親"型構造体のトランザクションのタイプを示す文字列を持っていますか? – martijn9612