2016-05-02 11 views
1

をCLASS2するクラス1のJSON表現のオブジェクトタイプフィールドをマッピング:ジャクソン - 私は定義された2つのPOJOを有する

クラス1 -

public class Class1 { 

     Map<String, Object> param1 = new HashMap<String, Object>(); 
     Map<String, Object> param2 = new HashMap<String, Object>(); 
     Object body; 

     // getters-setters... 
} 

クラス2 -

public class Class2 { 

    private String name = null; 
    private String description = null; 
    private List<Integer> data = new ArrayList<Integer>(); 

    // getters-setters... 
    } 

ボディフィールドは動的です私はそれをObject型にしました。 swagger codegenを使用して、実行時にClass2 Pojoを生成します。したがって、基本的にbodyオブジェクトはClass2を表します。 Class1は固定クラスであり、フィールドはすべて既知です。

json - 
{ 
    "param1" : { 
    "id" : 132 
    }, 
    "param2" : { 
    "address" : "String" 
    }, 

    "body" : { 
    "name" : "value", 
    "description" : "value", 
    "data" : [ ] 
    } 
} 

私はClass1のためにJSONの上にデシリアライズすることができます

ObjectMapper mapper = new ObjectMapper(); 
Class1 ij = mapper.readValue(new File(path_of_above_json), Class1.class); 
param1 = ij.getParam1(); 
param2 = ij.getParam2(); 
Object body = ij.getBody(); 

私はクラス2に身体のフィールドをマッピングします。この追加のクラスを避けるために、我々はジャクソンと同じことを達成することができます

class ResponseBodyDeserializer<T> implements JsonDeserializer<T> 
{ 
    @Override 
    public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) 
     throws JsonParseException 
    { 
     // Get the element from the parsed JSON 
     JsonElement content = je.getAsJsonObject().get("body"); 

     // Deserialize it 
     return new Gson().fromJson(content, type); 
    } 
} 

- 追加のクラスResponseBodyDeserializerで

Class2 body1 = new Class2(); 
Gson gson = new GsonBuilder().registerTypeAdapter(Class2.class, new ResponseBodyDeserializer<Class2>()).create(); 
ObjectMapper mapper = new ObjectMapper(); 
InputStream in = MainClass.class.getResourceAsStream(path_of_above_json); 
BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
body1 = gson.fromJson(r , Class2.class); 

:私はgsonと同じことを行うことができますか?

ありがとうございました!ここで

答えて

1
public static class Class1<T> { 
    private Map<String, Object> param1 = new HashMap<String, Object>(); 
    private Map<String, Object> param2 = new HashMap<String, Object>(); 
    private T body; 
} 

とこのようにそれを使用している:返信用

ObjectMapper mapper = new ObjectMapper(); 
Class1<Class2> ij = mapper.readValue(json, new TypeReference<Class1<Class2>>() {}); 
Map<String, Object> param1 = ij.getParam1(); 
Map<String, Object> param2 = ij.getParam2(); 
Class2 body = ij.getBody(); 
+0

ありがとうございました。 – HitchHiker

1

はあなたのコードの修正版は、

public class Class1<T> { 

      Map<String, Object> param1 = new HashMap<String, Object>(); 
      Map<String, Object> param2 = new HashMap<String, Object>(); 
      T body; 

      // getters-setters... 
    } 

    ObjectMapper mapper = new ObjectMapper(); 
    Class1 ij = mapper.readValue(new File(path_of_above_json), Class1<Class2>.class); 
    param1 = ij.getParam1(); 
    param2 = ij.getParam2(); 

Class2 body1 = ij.getBody(); 
+0

おかげで、私はとしてClass1のの.classを渡すことはできません引数。 'Class1は変数に解決できません。 ' – HitchHiker

関連する問題