“org.json.JSONArray实现了Serializable”:实现这一目标的最佳选择是什么?

时间:2010-01-09 22:52:03

标签: java arrays json serialization grails

我正在使用Grails Webflow,我传递给视图的对象是什么,它必须是序列化的。 我的域模型“实现Serializable”,因此它们可以工作。

问题是当我从WebService获得响应时。 它是org.json.JSONArray类。

我只想将整个数组传递给视图,但它没有实现Serializable, 所以它失败了,

关于如何通过这个或者我最好的选择的任何想法?

我可以只编辑org.json库的源代码并使每个类“imp serializable”吗?

或者将结果处理为执行“imp Serializable”的域对象

3 个答案:

答案 0 :(得分:6)

将其包装为实现transient的类中的Serializable属性,并覆盖readObject()writeObject()

public class SerializableJSONArray implements Serializable {
    private transient JSONArray jsonArray;

    public SerializableJSONArray(JSONArray jsonArray) {
        this.jsonArray = jsonArray;
    }

    public JSONArray getJSONArray() {
        return jsonArray;
    }

    private void writeObject(ObjectOutputStream oos) throws IOException {
        oos.defaultWriteObject();
        oos.writeObject(jsonArray.toString());
    }

    private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, JSONException {
        ois.defaultReadObject();
        jsonArray = new JSONArray((String) ois.readObject());
    }
}

你看到有一个getter返回包装的JSONArray。请在您的域对象中使用它。或者,您也可以让这个类extends JSONArray并将其所有方法委托给包装的JSONArray。一个体面的IDE可以在一秒钟内为您自动生成它们。

答案 1 :(得分:1)

无法记住该实际类的行为,但您可以将其作为JSON的String表示(显然是Serializable传递,然后重新将其解析到另一方的JSONArray - 至少JSONObject可以直接从JSON字符串构建,从我的头脑中我无法想到为什么JSONArray不会太

答案 2 :(得分:0)

根据this link,您需要做的就是将JSONArray对象声明为瞬态。一旦声明为瞬态,可序列化的运行时将忽略它。