Я использую 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());
После того, как я это сделал, исключение перестало генерироваться, и, похоже, все работало, за исключением, конечно, пропущенных полей.
Так вот, где я, я действительно в растерянности относительно того, что идет не так. Любая помощь с благодарностью.