Как сохранить объект, представленный в виде строки Json, в Couchbase Lite?

Я использую Couchbase Lite в своем приложении для Android. В приложении я получаю кучу объектов Json с сервера, которые я хочу хранить локально. Но я не могу найти способ сделать это без предварительной сериализации их в HashMap. Поскольку данные в любом случае хранятся в формате Json, это приводит к ненужным накладным расходам и приводит к большому количеству шаблонного кода.

Если бы я был более конкретным, это своего рода Json, который я получаю:

    "events":[
        {
        "title":"event1",
        "venue":{
            "name":"venue1"
        }
    ]

Я использую Gson для преобразования того, что входит в массив, в POJO:

public final class Event {
    @SerializedName("title") private String title;
    @SerializedName("venue") private Venue venue;

    public static final class Venue {
        @SerializedName("name") private String name;

        public Map<String, Object> toMap() {
            Map<String, Object> docContent = new HashMap<String, Object>();
            docContent.put("name", name);
            return docContent;
        }
    }

    public Map<String, Object> toMap() {
        Map<String, Object> docContent = new HashMap<String, Object>();
        docContent.put("title", title);
        docContent.put("venue", venue.toMap());
        return docContent;
    }

    // getters left out
}

И затем я использую объект Java для его хранения:

Document document = database.createDocument();
document.putProperties(event.toMap());

Встраивание идет намного глубже и полей гораздо больше. Я чувствую, что должен быть способ сделать вещи проще.

Спасибо за любые подсказки!


person SqueezyMo    schedule 18.04.2015    source источник


Ответы (2)


Я не видел никакого способа напрямую хранить JSON в документе Couchbase, но вы можете упростить свою POJOfication, используя некоторые из предложений, перечисленных здесь: Преобразовать JSON в карту

Вы упомянули, что получаете свой JSON с сервера, если используете что-то вроде RetroFit: https://github.com/square/retrofit вам никогда не придется иметь дело напрямую с JSON. Вам все равно придется писать свою логику сопоставления, но вы сможете просто передавать объекты ответа веб-службы прямо в кушетку.

person nave051    schedule 11.05.2015
comment
До сих пор я заново изобретал колесо и написал свой собственный POJO-to-map (де)сериализатор на основе Reflection API, что, по общему признанию, является довольно уродливым решением с точки зрения производительности. Думаю, я посмотрю на Retrofit, это похоже на путь. Спасибо. - person SqueezyMo; 18.05.2015

Вот пример того, как это сделать. Если ваш JSON находится в JSONString

ObjectMapper mapper = new ObjectMapper();  // Usually you only need one instance of this per app.
try {
    Map<String, Object> map = mapper.readValue(JSONString, Map.class);
    Document document = db.createDocument();
    document.putProperties(map);
} catch (IOException | CouchbaseLiteException ex) {
    ex.printStackTrace();
}
person Hod    schedule 14.09.2016