1

外部ライブラリ (Jackson) を使用するアプリケーションがあり、必要なメソッドには引数としてクラス リテラルが必要です。したがって、JSON 文字列を解析して User オブジェクトにする場合:

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(new File("user.json"), User.class);

ここで、このメソッドを動的に使用したいと考えています (つまり、同じコード行を使用して異なる JSON 文字列を解析します)。例えば:

String json1 = "{"type":"jacket",...}";
String json2 = "{"type":"sweater",...}";

Object object = mapper.readValue(json1/json2, ???); 
//returns a Jacket object OR Sweater object based on the "type" key
//i.e. use Jacket.class as the 2nd argument if "type" is "jacket"
//OR Sweater.class if "type" is "sweater"

//After getting the deserialized object,
//if object is Jacket, cast as a Jacket
//if object is Sweater, cast as a Sweater

もちろん、問題の JSON 文字列は任意のクラスのものである可能性があるため、単純に if-else ループをハードコーディングすることはできません。私はカスタムシリアライザーを見てきましたが、率直に言って、それが何について話しているのかについてかなり迷っています。

readValue要約すると、最初に String からクラス リテラルを定義し、次に結果の Object を特定のクラスにキャストする何らかの方法が必要です (ただし、動的に機能させることに重点を置いています)。

4

2 に答える 2

1

JSON 型変数と Java クラス型の間のどこかにマッピングが必要なようです。

通常、結果は次のマップのようになります。

Map<String, Class<? extends YourSupertype>> map = new HashMap<>();
map.put("sweater", Sweater.class);
map.put("jacket", Jacket.class);

考えられる衣類の種類をファイルのどこかに保存してから、次のようにします。

String clothingType = nextEntryFromFile();
String className = constructClassNameFromClothingType(clothingType);
map.put(clothingType, Class.forName(className));
于 2012-07-25T10:02:27.497 に答える
0

バージョン 1.5 の Jackson はポリモーフィック タイプの処理をサポートしているため、ここをチェックしてください http://www.cowtowncoder.com/blog/archives/2010/03/entry_372.html これらの場合にデシリアライゼーションを正しく処理する方法の例があります。

于 2012-07-25T21:28:16.677 に答える