2016-11-05 8 views
6

私たちのプロジェクトに取り組んでいるときに何か不思議だった。 GoogleのGSON APIは、逆シリアル化したいJSONのコンストラクタを使用していますか?例えば、Java - GoogleのGSONはコンストラクタを使用していますか?

私はEmployeeオブジェクトに変換したいJSON Stringを持っています。 Employeeオブジェクトには、パラメータにいくつかのチェックを適用するコンストラクタがあります(たとえば、ID> 0)。以下のコードを使用してJSONを逆シリアル化しています。しかし、JSONを従業員にデシリアライズするときにもこのコンストラクタが呼び出されますか?

GSONへのリンク:https://github.com/google/gson

EDIT: だから私は、コンストラクタが呼び出されない考え出しブレークポイントで実験しました。とにかく誰かがそれを呼び出す方法を知っていますか? GSON、ジャクソンもしくはれるJava Persistence API(JPA)のような

/** 
* The GSON class to help you create and de-serialize the JSON objects. 
*/ 
Gson gson = new Gson(); 

/** 
* Convert JSON to an object. 
* @param json The JSON to convert. 
* @param cls The class to convert to. 
* @return The converted JSON to object. 
*/ 
public Object jsonToObject(String json, Class<?> cls) { 
    return gson.fromJson(json, cls); 
} 
+2

コンストラクタにブレークポイントを置き、コードをデバッグしますか? –

+0

@RC。はい、あなたは正しい、私はそれをテストし、コンストラクタが呼び出されていません。 – Guido

+1

オブジェクトをインスタンス化するために空のコンストラクタを使用していると仮定し、読み込みフィールドは直接リフレクションを使用して設定されます。 – EpicPandaForce

答えて

7

ライブラリは、一般的に、オブジェクトをインスタンス化し、反射によってそのフィールドを設定するには、引数なし(デフォルト)コンストラクタを使用します。新しいバージョンのGSONでは、デフォルトのコンストラクタをもう宣言する必要はありません。hereを参照してください。

GSONで特定のコンストラクタを呼び出す必要がある場合は、既にhereのようにカスタムJsonDeserializerを実装できます。

ジャクソンのような他のライブラリでは、(GSON doesのような)フィールドの代わりに、メソッドの逆シリアル化を定義して、不足している特殊なコンストラクタ呼び出しを置き換えることができます。

関連する問題