Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaJSON序列化-最佳实践_Java_Json_Design Patterns - Fatal编程技术网

JavaJSON序列化-最佳实践

JavaJSON序列化-最佳实践,java,json,design-patterns,Java,Json,Design Patterns,我需要为一些对象实现JSON序列化,在与泛型集合集成时遇到了一个问题 所有可序列化类都实现此接口(JSONObject来自库): 基于java.util.list的我的集合的代码大致如下: class AwesomeList<T extends JSONSerializable> implements JSONSerializable{ private LinkedList<T> items = new LinkedList<T>(); ...

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

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

基于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
    }
}

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

您是否与此库绑定?很受欢迎。我自己没有将它用于泛型,但他们的头版说Gson认为对泛型的支持非常重要。

好吧,当将它写入文件时,您知道什么是类T,所以您可以将它存储在
dump
中。然后,当读回它时,您可以使用反射动态调用它

public JSONObject dump() throws JSONException {
    JSONObject result = new JSONObject();
    JSONArray a = new JSONArray();
    for(T i : items){
        a.put(i.dump());
        // inside this i.dump(), store "class-name"
    }
    result.put("items", a);
    return result;
}

public void load(JSONObject obj) throws JSONException {
    JSONArray arrayItems = obj.getJSONArray("items");
    for (int i = 0; i < arrayItems.length(); i++) {
        JSONObject item = arrayItems.getJSONObject(i);
        String className = item.getString("class-name");
        try {
            Class<?> clazzy = Class.forName(className);
            T newItem = (T) clazzy.newInstance();
            newItem.load(obj);
            items.add(newItem);
        } catch (InstantiationException e) {
            // whatever
        } catch (IllegalAccessException e) {
            // whatever
        } catch (ClassNotFoundException e) {
            // whatever
        }
    }
publicJSONObject dump()抛出JSONException{
JSONObject结果=新建JSONObject();
JSONArray a=新的JSONArray();
对于(TI:项目){
a、 put(i.dump());
//在这个i.dump()中,存储“类名”
}
结果.付诸表决(“项目”,a);
返回结果;
}
公共无效加载(JSONObject obj)抛出JSONException{
JSONArray arrayItems=obj.getJSONArray(“项目”);
对于(int i=0;i正如其他人所暗示的,你应该考虑倾销org。JSON的库。这些天已经过时了,试图解决它的问题是浪费时间。

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

您是否尝试过json io()

此库允许您序列化/反序列化任何Java对象图,包括包含循环的对象图(例如,A->B,B->A)。它不要求您的类实现任何特定接口或从任何特定Java类继承

除了Java到JSON(以及JSON到Java)的序列化之外,您还可以使用它格式化(漂亮打印)JSON:


老实说,我看不出这在已知类型中是如何工作的。您是否将类名存储在JSON数据包中?不,每个对象都知道如何从JSONObject加载自己(实际上它只是关联数组)。我更新了帖子以展示我想要做的事情。gson可以很好地处理泛型。上次我检查gson不处理循环引用..虽然更新可以解决这一问题..我发现[link]是最好的。检查我的这个问题,了解如何在gson[link]中使用泛型进行json转换GSON的使用非常非常简单。如果您需要处理泛型、循环引用、接口、集合和定义了接口的映射(映射不是LinkedHashMap)等,请尝试使用json io:。
T newItem = new T();
newItem.load(obj);
public JSONObject dump() throws JSONException {
    JSONObject result = new JSONObject();
    JSONArray a = new JSONArray();
    for(T i : items){
        a.put(i.dump());
        // inside this i.dump(), store "class-name"
    }
    result.put("items", a);
    return result;
}

public void load(JSONObject obj) throws JSONException {
    JSONArray arrayItems = obj.getJSONArray("items");
    for (int i = 0; i < arrayItems.length(); i++) {
        JSONObject item = arrayItems.getJSONObject(i);
        String className = item.getString("class-name");
        try {
            Class<?> clazzy = Class.forName(className);
            T newItem = (T) clazzy.newInstance();
            newItem.load(obj);
            items.add(newItem);
        } catch (InstantiationException e) {
            // whatever
        } catch (IllegalAccessException e) {
            // whatever
        } catch (ClassNotFoundException e) {
            // whatever
        }
    }
String niceFormattedJson = JsonWriter.formatJson(jsonString)