使用GSON对具有相同接口的类进行反序列化

时间:2016-06-03 06:38:12

标签: java json gson

我有一个接口(称为内容)和几个实现该接口的类(例如ContentVideo,ContentAd ...)。我收到一个JSON对象,其中包含这些对象的列表。我开始在单独的类中手动反序列化这些对象,但最近遇到了GSON,这将极大地简化了这个过程。但我不确定如何实现这一点。

这是ContentVideoJSONParser

public class Main extends Application {

    private final int PREF_MIN_WIDTH = 500;
    private final int PREF_MIN_HEIGHT = 500;

    @Override
    public void start(Stage primaryStage) {
        try {
            Scene scene = new Scene(new HBox(), PREF_MIN_WIDTH, PREF_MIN_HEIGHT);

            primaryStage.setScene(scene);
            primaryStage.showingProperty().addListener((observable, oldValue, showing) -> {
                if(showing) {
                    primaryStage.setMinHeight(primaryStage.getHeight());
                    primaryStage.setMinWidth(primaryStage.getWidth());
                    primaryStage.setTitle("My mininal size is: W"+ primaryStage.getMinWidth()+" H"+primaryStage.getMinHeight());
                }
            });

            primaryStage.show();

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

ContentAdJSONParser看起来完全相同,除了返回ContentAd对象的ArrayList以及此行以检索对象:

public ArrayList<ContentVideo> parseJSON(String jsonString) {
        ArrayList<ContentVideo> videos = new ArrayList<>();

        JSONArray jsonArr = null;
        Gson gson = new Gson();
        try {
            jsonArr = new JSONArray(jsonString);
            for(int i = 0; i < jsonArr.length(); i++) {
                JSONObject jsonObj = jsonArr.getJSONObject(i);
                ContentVideo cv = gson.fromJson(jsonObj.toString(), ContentVideo.class);
                videos.add(cv);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        return videos;
    }

将这些与类合并为一个的最简单方法是什么?注意:一个JSON对象只包含一个类,ContentVideo或ContentAd。它们不像其他SO问题那样混合,这需要TypeAdapter。

这似乎是一个直截了当的问题,但我无法弄清楚。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

或许这样的事情?

public <T extends Content> ArrayList<T> parseJSON(String jsonString, Class<T> contentClass) {
    ArrayList<T> contents = new ArrayList<>();

    JSONArray jsonArr = null;
    Gson gson = new Gson();
    try {
        jsonArr = new JSONArray(jsonString);
        for(int i = 0; i < jsonArr.length(); i++) {
            JSONObject jsonObj = jsonArr.getJSONObject(i);
            T content = gson.fromJson(jsonObj.toString(), contentClass);
            contents.add(content);
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

    return contents;
}