Десериализация JSON с использованием GSON пропускает элементы данных из hashmap в hashmap - PullRequest
0 голосов
/ 14 марта 2011

Я использую GSON для десериализации некоторых файлов JSON. Вот метод десериализации, который я написал, я читаю файл JSON и сохраняю все это как строку, которую я передаю этому методу. Этот метод успешно работает для 4 из 5 файлов JSON, связанных с этим проектом.

protected ArrayList<Entry> deserialize(String json) throws Exception
{
    ArrayList<Entry> list = new ArrayList<Entry>( );


    JsonParser parser = new JsonParser();

    JsonArray jarray = (JsonArray) parser.parse(json);

    for (int i = 0; i < jarray.size(); i++)
    {

        // Parse out the brand
        JsonObject jentry = (JsonObject) jarray.get(i);

        JsonPrimitive jbrand = jentry.getAsJsonPrimitive("brand");

        String className = jbrand.getAsString();

        Entry entry = (Entry) gson.fromJson(jentry, Class.forName(className));

        list.add(entry);
    }

    return list;
}

Вот файл JSON, который я проанализировал и поместил в строку, есть несколько объектов, привязанных к 'jentry', но я просто включу один. Если это выглядит странно, возможно, потому, что я использовал плагин Firefox для просмотра файлов JSON, и я скопировал / вставил из этого плагина.

[

*
  -
  {
      o pattern: "3 5 * * 1-5"
      o starts: 1288249260913
      o ends: 1291125660913
      o skipHolidays: false
      o lastFired: 1289988180395
      o
        -
        template: {
            + location: ""
            + damageCause: ""
            + signed: false
            + signedBy: ""
            + approvedBy: "Ralph"
            + requestedBy: "Ralph"
            + estHours: 0
            + actHours: 0
            + chargeTo: ""
            + priority: "ROUTINE"
            + reason: ""
            + materials: ""
            + serviceId: 1
            + descr: "HELP WITH LEAVES,BLOW LEAVES IN YOUR AREA NEAR DRAINS Check for garbage. [sp] Mow and weedeat where needed in your area. [sp] Work on leaves where needed. [wi]"
            + comments: [ ]
            + futureId: 3
            + inventoryId: -1
            +
              -
              trail: [
                  #
                    -
                    {
                        * stamp: 1288026816857
                        * status: "OPEN"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1288026889374
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1288194095170
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1288287964481
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1288785076532
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1288797119525
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1289307416921
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1289308339165
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1289834523635
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1289847660913
                        * status: "DISPATCHED"
                        * byId: 2
                    }
              ]
            + requestDate: 1289329260913
            + assignedDate: 1288029660912
            + supplies: [ ]
            + id: 3
            + updateDate: 1289847660913
            + createUserId: 2
            + updateUserId: 2
            + createDate: 1288026816857
            + brand: "org.workplicity.marist.grounds.GroundsRequest"
        }
      o workSlateId: 16
      o serviceId: 1
      o enabled: false
      o id: 3
      o updateDate: 1291235385719
      o createUserId: 2
      o updateUserId: 2
      o createDate: 1288026889373
      o brand: "org.workplicity.entry.event.Weekdays"
  }

Проблема в том, что когда GSON возвращается в JSON (сериализация?), Ему не хватает некоторых полей. Вот вывод, соответствующие пропущенные строки - все ниже «template:» и выше «serviceID:», я продолжу и включу весь объект снова.

[

*
  -
  {
      o pattern: "3 5 * * 1-5"
      o starts: 1288249260913
      o ends: 1291125660913
      o skipHolidays: false
      o lastFired: 1289988180395
      o
        -
        template: {
            + serviceId: 1
            + descr: "HELP WITH LEAVES,BLOW LEAVES IN YOUR AREA NEAR DRAINS Check for garbage. [sp] Mow and weedeat where needed in your area. [sp] Work on leaves where needed. [wi]"
            + comments: [ ]
            + futureId: 3
            + inventoryId: -1
            +
              -
              trail: [
                  #
                    -
                    {
                        * stamp: 1288026816857
                        * status: "OPEN"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1288026889374
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1288194095170
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1288287964481
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1288785076532
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1288797119525
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1289307416921
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1289308339165
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1289834523635
                        * status: "DISPATCHED"
                        * byId: 2
                    }
                  #
                    -
                    {
                        * stamp: 1289847660913
                        * status: "DISPATCHED"
                        * byId: 2
                    }
              ]
            + requestDate: 1289329260913
            + assignedDate: 1288029660912
            + supplies: [ ]
            + id: 3
            + updateDate: 1289847660913
            + createUserId: 2
            + updateUserId: 2
            + createDate: 1288026816857
            + brand: "org.workplicity.marist.grounds.GroundsRequest"
        }
      o workSlateId: 16
      o serviceId: 1
      o enabled: false
      o id: 3
      o updateDate: 1299694066807
      o createUserId: 2
      o updateUserId: 2
      o createDate: 1288026889373
      o brand: "org.workplicity.entry.event.Weekdays"
  }

Это происходит для каждого объекта в файле JSON. Отладка в NetBeans показала, что jentry JsonObject имеет хеш-таблицу с соответствующими парами ключ-значение для каждого элемента данных в строке JSON; и «шаблон» хранится как хеш-таблица в этой хеш-таблице, которая может быть, а может и не быть проблемой, которую я, честно говоря, не смог выяснить.

Теперь, когда я первоначально запустил этот метод для проблемного файла JSON, я получил исключение в этой строке:

Entry entry = (Entry) gson.fromJson(jentry, Class.forName(className));

Проблема заключалась в том, что у определенных классов, связанных с этим конкретным файлом JSON, не было конструкторов без аргументов, поэтому мне пришлось зарегистрировать некоторые InstanceCreators в сборщике GSON следующим образом:

gsonBuilder.registerTypeAdapter(Weekdays.class, new WeekdaysInstanceCreator());
gsonBuilder.registerTypeAdapter(Once.class, new OnceInstanceCreator());

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

Так вот, где я, я действительно в растерянности относительно того, что идет не так. Любая помощь с благодарностью.

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

Когда Gson удаляет поле, присутствующее в JSON, обычно это происходит потому, что класс, в который вы десериализуетесь, не определяет это поле. Это может произойти, если вы десериализуете его с типом базового класса. Можете ли вы проверить, содержит ли org.workplicity.marist.grounds.GroundRequest поля, на которые вы ссылаетесь?

0 голосов
/ 19 июня 2011

Отладка в NetBeans показала, что JentObject JsonObject имеет хеш-таблицу с соответствующими парами ключ-значение для каждого элемента данных в строке JSON;и «шаблон» хранится как хеш-таблица в этой хеш-таблице, которая может быть, а может и не быть проблемой, которую я, честно говоря, не смог выяснить.

Это нормально.Изначально Gson считывает объекты JSON в JsonObject, в котором имена и значения элементов JSON хранятся в LinkedHashMap.Итак, если структура JSON включает в себя объект в объекте, то исходная структура, в которую Gson считывает JSON, будет JsonObject с LinkedHashMap, в которой одна из записей будет иметь значение другого JsonObject сa LinkedHashMap.

Оригинальный пост не содержит четкого описания того, что содержание карт в JsonObjects неожиданно отсутствовало.Это только описывало, что часть содержимого была замечена отсутствующей после сериализации десериализованных данных.Так как не было предоставлено достаточно информации для воспроизведения проблемы, люди могут только догадываться, в чем проблема могла быть.И предположение Индер выглядит так же хорошо, как и любой.Я не вижу ничего, что указывало бы на недостаток в Gson.

Относительно конкретного утверждения заголовка вопроса, что «десериализация JSON с помощью GSON пропускает элементы данных из хеш-карты в хэш-карте» из оставшегося содержимого вопроса,Я не думаю, что первоначальный вопрос на самом деле означал, что целевой структурой Java была карта внутри карты.Если целевой структурой Java была карта внутри карты, то я не смог бы воспроизвести сценарий, в котором Gson таинственным образом пропускает некоторые поля при условии, что элементы JSON правильно связаны с полями Java и что обработка Gsonпредоставляется выпуск 325 (с пользовательской десериализацией).

0 голосов
/ 13 апреля 2011

Пожалуйста, попробуйте загрузить последнюю версию Gson, 1.7.Он содержит много новых функций, которые могут вам помочь.См. http://groups.google.com/group/google-gson/browse_thread/thread/6272c9be58676e47#.

Во-первых, в Instance Creator больше нет необходимости, поскольку Gson может автоматически выделять пространство кучи для любого экземпляра класса без использования конструктора по умолчанию или создателя экземпляра.

Что касается пропуска полей, по умолчанию Gson пропустит поля, если они "статические", "временные" или "внутренние классы".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...