«org.json.JSONArray реализует Serializable»: каков наилучший вариант для достижения этой цели? - PullRequest
2 голосов
/ 10 января 2010

Я использую Grails Webflow, какой бы объект я ни передавал представлению, он должен быть сериализован. Мои доменные модели "реализуют Serializable", поэтому они работают.

Проблема в том, что я получаю ответ от WebService. Он принадлежит к классу org.json.JSONArray.

Я просто хочу передать весь массив в представление, но он не реализует Serializable, так что не получается,

Есть какие-нибудь мысли о том, как мне это пройти, или мой лучший вариант?

Можно ли просто отредактировать исходный код библиотеки org.json и сделать каждый класс "imp Serializable"?

Или обработать результат в доменные объекты, которые "imp Serializable"

Ответы [ 3 ]

6 голосов
/ 17 апреля 2010

Оберните его как свойство 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());
    }
}

Вы видите, что есть геттер, который возвращает упакованный JSONArray. Вместо этого используйте его в объектах вашего домена. При желании вы также можете разрешить этому классу extends JSONArray и делегировать все его методы в упакованный JSONArray. Приличная IDE может автоматически сгенерировать их для вас за секунду.

1 голос
/ 10 января 2010

Не могу вспомнить поведение этого фактического класса, но вы можете просто передать его как String представление (что, очевидно, Serializable) JSON, а затем повторно проанализировать его JSONArray с другой стороны - по крайней мере JSONObject может быть построено непосредственно из JSON String, и из головы не могу понять, почему JSONArray не будет слишком.

0 голосов
/ 08 сентября 2015

Согласно этой ссылке все, что вам нужно сделать, это объявить объект JSONArray как временный. Как только он объявлен как временный, он игнорируется сериализуемой средой выполнения.

...