Java JSON 序列化 - 最佳实践

2022-09-01 09:46:41

我需要为某些对象实现 JSON 序列化,并且在与泛型集合集成时遇到了问题。

所有可序列化的类都实现此接口(JSONObject 来自库):

interface JSONSerializable{
    public JSONObject dump() throws JSONException //serializes object
    public void load(JSONObject obj) throws JSONException //deserializes object
}

基于java.util.list的集合代码看起来或多或少是这样的:

class AwesomeList<T extends JSONSerializable> implements JSONSerializable{
    private LinkedList<T> items = new LinkedList<T>();
    ...
    ...

    public JSONObject dump() throws JSONException {
        JSONObject result = new JSONObject();
        JSONArray a = new JSONArray();
        for(T i : items){
            a.put(i.dump());
        }
        result.put("items", a);
        return result;
    }

    public void load(JSONObject obj) throws JSONException{
        //here is my problem
    }
}

我的问题是:当我从JSONObject加载AwesomeList时,我需要创建它的元素,但这是不可能的,因为java禁止我写

T newItem = new T();
newItem.load(obj);

我应该如何修改我处理此任务的方法?


答案 1

您是否与这个库绑定?Google Gson非常受欢迎。我自己没有在泛型中使用它,但他们的首页说Gson认为对泛型的支持非常重要。


答案 2

正如其他人所暗示的那样,你应该考虑转储org.json的库。如今,它几乎已经过时了,试图解决它的问题是浪费时间。

但具体问题;类型变量 T 只是没有任何信息来帮助您,因为它只不过是编译时信息。相反,您需要传递实际的类(作为'Class cls'参数),然后您可以使用'cls.newInstance()'创建一个实例。