Java JSON序列化 - 最佳实践

KCH*_*KCH 26 java json design-patterns

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

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

interface JSONSerializable{
    public JSONObject dump() throws JSONException //serializes object
    public void load(JSONObject obj) throws JSONException //deserializes object
}
Run Code Online (Sandbox Code Playgroud)

基于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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

T newItem = new T();
newItem.load(obj);
Run Code Online (Sandbox Code Playgroud)

我应该如何修改我的方法呢?

Mis*_*ble 34

你和这个图书馆绑在一起了吗?Google Gson非常受欢迎.我自己并没有将它与Generics一起使用,但是他们的头版说Gson认为对泛型的支持非常重要.

  • 上次我检查gson不处理循环引用..虽然更新可以修复...我发现[链接] http://jackson.codehaus.org/最好.查看我的这个问题,了解如何在gson中使用泛型进行json转换[link] http://stackoverflow.com/questions/5528385/json-conversion-using-gson (3认同)
  • gson可以很好地处理泛型. (2认同)

Sta*_*Man 6

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

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