GSONを使用していくつかのJSONファイルを逆シリアル化します。これが私が書いた逆シリアル化メソッドです。JSONファイルを読み取り、このメソッドに渡す文字列としてすべてを保存します。このメソッドは、このプロジェクトに関連する5つのJSONファイルのうち4つで正常に機能します。
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」にバインドされるオブジェクトがいくつかありますが、1つだけ含めます。奇妙に見える場合は、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でのデバッグにより、JsonObject'jentry'には、JSON文字列の各データメンバーに対応するキーと値のペアを持つハッシュテーブルがあることがわかりました。'template'は、このハッシュテーブル内にハッシュテーブルとして格納されます。これは、私が正直に見つけることができなかった問題である場合とそうでない場合があります。
問題のあるJSONファイルでこのメソッドを最初に実行したときに、次の行で例外が発生しました。
Entry entry = (Entry) gson.fromJson(jentry, Class.forName(className));
問題は、この特定のJSONファイルに関連する特定のクラスに引数なしのコンストラクターがなかったため、次のようにいくつかのInstanceCreatorをGSONビルダーに登録する必要があったことです。
gsonBuilder.registerTypeAdapter(Weekdays.class, new WeekdaysInstanceCreator());
gsonBuilder.registerTypeAdapter(Once.class, new OnceInstanceCreator());
私がそれをした後、例外はスローされなくなり、もちろん欠落しているフィールドを除いて、すべてが機能したように見えます。
だから私はそこにいます、私は何が悪いのかについて本当に途方に暮れています。どんな助けでも大歓迎です。