Jacksonを使用して、フィールドの 1 つが任意のキーと値の辞書である JSON を解析しています。特定の値の型 ( 、、、および)Map<String, Object>
のみを許可するという事実がなければ、これは通常 Java に直接マップされます。String
Long
Double
Long[]
Double[]
現在、ドキュメントを完全に解析してから、各マップの各値を繰り返し処理し、instanceof
有効かどうかを確認して、無効な場合はユーザーにエラーを返します。もちろん、これは長いドキュメントの場合はかなり非効率的です。
解析中に入力のエラーをキャッチできるように、このマップ値の型の制限をジャクソンに表現する方法を知っている人はいますか? 注釈は関連しているように見えました@JsonSubTypes
が、この場合にどのように適用されるかわかりませんでした。
置き換えたいコードのタイプの例を次に示します。
static class Doc {
List<Item> items;
}
static class Item {
/* ...other fields snipped... */
public Map<String, Object> payload;
@JsonIgnore
public void check() throws Exception {
for(Object value: item.payload.values()) {
if(value instanceof String) {
else if(value instanceof Long) { }
else if(value instanceof Long[]) { }
else if(value instanceof Double) { }
else if(value instanceof Double[]) { }
else { throw new Exception("Unsupported value type"); }
}
}
}
void read(InputStream stream) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Doc doc = mapper.readValue(stream, Doc.class);
// Check all payload types are valid
for(Item item: doc.items) {
item.check()
}
}