1

Jacksonを使用して、フィールドの 1 つが任意のキーと値の辞書である JSON を解析しています。特定の値の型 ( 、、、および)Map<String, Object>のみを許可するという事実がなければ、これは通常 Java に直接マップされます。StringLongDoubleLong[]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()
    }
}
4

2 に答える 2

1

Jackson が提供する注釈または型システムを使用して、私が望むものを表現する方法を見つけることができなかったので、代わりにカスタム デシリアライザーを作成することで、回避しようとしていたことを実行することになりました。

確かに、これにより、許可されたデータ型と解析エラーをより簡潔に制御できますが、私が望んでいたよりも冗長です!

于 2012-11-18T11:29:26.427 に答える
1

これを行うための特定の機能はありませんが、Map受け入れられないサブタイプに対して例外をスローするサブクラスを作成するのはどうですか? 何かのようなもの:

public class LimitedMap extends HashMap<String,Object> {
  public Object put(String key, Object value) {
     // verify it's not a Boolean or Map. And note that Jackson uses List
     // for JSON Arrays; Double for floating point (by default), Integer or Long for ints
  }
} 

代替手段は、JSON Schemaバリデーターを使用することです (その多くは Jackson に基づいています)。

于 2012-11-19T18:05:37.803 に答える