8

Jackson 1.9.9は、スカラー値(bool、int、string)に解析する内容に多少の一貫性がありません。すべての配列またはオブジェクト型は失敗しますが、任意のスカラー型を文字列に入れることができます。boolの場合、0ではなく0がfalse/trueにマップされます。int属性は数値のみを受け入れます。

public class Foo { public String s; public boolean b; public int i; }

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue("{\"s\":\"abc\"}", Foo.class).s); // "abc"
System.out.println(mapper.readValue("{\"s\":true}", Foo.class).s); // "true"
System.out.println(mapper.readValue("{\"s\":123}", Foo.class).s); // "123"
System.out.println(mapper.readValue("{\"b\":123}", Foo.class).b); // true
System.out.println(mapper.readValue("{\"b\":0}", Foo.class).b); // false
System.out.println(mapper.readValue("{\"b\":\"abc\"}", Foo.class).b); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"i\":\"abc\"}", Foo.class).i); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"i\":true}", Foo.class).i); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"s\":[]}", Foo.class).s); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"s\":{}}", Foo.class).s); // fails  with JsonMappingException
System.out.println(mapper.readValue("{\"b\":[]}", Foo.class).b); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"b\":{}}", Foo.class).b); // fails  with JsonMappingException
System.out.println(mapper.readValue("{\"i\":[]}", Foo.class).i); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"i\":{}}", Foo.class).i); // fails  with JsonMappingException

たとえばブール値をString属性に渡した場合にエラーが発生するように、Jacksonに厳密なモードはありますか?

私はこれをJAX-RSプロジェクトで使用していますが、すべてではありませんがほとんどのエラーが発生するため、Jacksonによってスローされた例外に基づくエラー報告がやや困難になります。生のObjectNodeを取得して、すべてを手動でチェックすることは避けたいと思います。呼び出し元が文字列のブール値を渡した場合、これはプログラミングエラーである可能性が高いため、彼に伝えたいと思います。

4

2 に答える 2

4

FWIW、あなたがこれにずっと後で遭遇した場合、私のように、ALLOW_COERCION_OF_SCALARSは、ジャクソンがあなたに代わって行う変換の数を減らすことでいくらか助けになりますが、完全な厳密なモードにはほど遠いです。多くの型強制は引き続き実行されますが、一部は防止されます。リンクされたドキュメントは、詳細の一部になります。

于 2018-11-27T21:54:22.377 に答える
2

Jackson のデータ バインディングは、時間の経過とともに成長し、より多くの自動強制を受け入れるようになりました。より厳密なチェックを強制する機能 (DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES) がいくつかありますが、多くは要求されていません。

これを考えると、 /JsonDeserializerのように、より厳密にしたいタイプのカスタムを登録するのが最善です。より厳密なチェックを実装できます。booleanBoolean

さらに、より厳しい制限のために機能をリクエストできます。これは、特に一部のユースケースでは理にかなっていると思います。緩い変換が実際の問題を隠すことができる場合。

于 2012-09-22T23:04:38.723 に答える