2017-04-10 2 views
0

パートナーAPIがまだうまくいきません。私が受け取る オブジェクトが必要なソリューションがJsonMappingExceptionを記録し、DBに保存して、オブジェクトをクラッシュしないことです。このJsonMappingExceptionすべての処理と逆シリアル化

{ 
    "id": 1,   // Can deserealize 
    "type": "HUMAN", // Can deserealize 
    "age": 18,  // Can deserealize 
    "armor": {},  // JsonMappingException 
    "weapon": {}  // Can deserealize 
} 

のようなものであるが、結果には非直列化できないオブジェクトの代わりにヌル値を置きます。

{ 
    "id": 1,   // Can deserealize 
    "type": "HUMAN", // Can deserealize 
    "age": 18,  // Can deserealize 
    "armor": null, // Replaced to null or default object 
    "weapon": {}  // Can deserealize 
} 

何の方法が発射されなかったDeserializationProblemHandler-私が追加しようとしたとDeserializationFeatureは - 私が必要のような何の機能が存在すると思いません。

どのように私は任意のオブジェクトにこの動作を適用することができるようにジャクソンの動作を専門にすることができますので、私はこれを処理し、nullまたは任意のデフォルトオブジェクトで置き換えることができます

+0

デシリアライズコードを共有できますか? –

+0

'ObjectMapper mapper = new ObjectMapper(); Player player = null; try { \t player = mapper.readValue(新しいファイル( "bad_json.txt")、Player.class); } catch(IOException e){ \t log.error( "Bad json"、e); } '一部のクラスには、JsonMappingExceptionもスローするデシリアライザがあります。 –

+0

質問に追加できますか?また、 'Player'クラスの構造体も追加できますか? –

答えて

0

これは、ビジネスのユースケースのほうがJacksonという特定の動作よりも似ています。また、Javaでは、Exceptionを呼び出し、valueを同時に返すメソッドを持つことはできません。

代わりに(完全に不要です)カスタムデシリアライザを書くのは、デシリアライズした後、そのフィールドをチェックすることができ、それは、例えば:

String json = ""; //json string 
ObjectMapper mapper = new ObjectMapper(); 
Person person = mapper.readValue(json, Person.class); 
if(person.getArmour() == null) { 
    LOGGER.error("Received a Person object witn no armour : {}", person.getId()); 
} 
//Save Person object 

P.S.オブジェクトを永続化する前に、ヌルだ場合はエラーをログに記録します上記の例ではslf4jを使用しています。

+0

物事は、 'mapper.readValue(json、Person.class);が鎧のオブジェクトを逆シリアル化するときにJsonMappingExceptionをスローするため、私はPersonオブジェクトを取得できません。 –

+0

'Person'クラスの構造体や逆シリアル化ロジックを追加できますか? 'armour'がnullの場合、' JsonMappingException'を投げるべきではないと思ってください。 –

+0

質問を見ると、私はその鎧がJsonMappingExceptionをスローするとマークしました。それをキャッチしてログに記録し、装甲をヌルに置き換えたいと思います。 –

関連する問題