【问题标题】:"org.json.JSONArray implements Serializable": What's the best option to achieve this?“org.json.JSONArray 实现 Serializable”:实现这一目标的最佳选择是什么?
【发布时间】:2010-01-09 22:52:02
【问题描述】:

我正在使用 Grails Webflow,我传递给视图的任何对象都必须进行序列化。 我的域模型“实现了可序列化”,因此它们可以工作。

问题是当我收到来自 WebService 的响应时。 它属于 org.json.JSONArray 类。

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

有什么想法可以通过这个,或者我的最佳选择吗?

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

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

【问题讨论】:

  • 你的观点对JSONArray有什么作用?
  • 我想从这个数组中打印出值,所以我总是可以将数组处理成一个普通的可序列化对象数组

标签: java arrays json serialization grails


【解决方案1】:

将其作为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 可以在一秒钟内为您自动生成它们。

【讨论】:

  • 这不会导致变量丢失吗?
【解决方案2】:

无法记住该实际类的行为,但您可以将其作为 String 表示形式传递 (显然是 Serializable 的 JSON,然后将其重新解析为 @另一边的 987654323@ - 至少 JSONObject 可以直接从 JSON 字符串构造,而且我想不出为什么 JSONArray 不会。

【讨论】:

  • Mh,遗憾的是该类只需要实现 Serializable,我无法在视图端解析它,它放置在 Session 中以便移动,我想说的是紧凑
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多