0

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());

私がそれをした後、例外はスローされなくなり、もちろん欠落しているフィールドを除いて、すべてが機能したように見えます。

だから私はそこにいます、私は何が悪いのかについて本当に途方に暮れています。どんな助けでも大歓迎です。

4

3 に答える 3

2

Gson が JSON に存在するフィールドをドロップするのは、通常、デシリアライズ先のクラスがそのフィールドを定義していないためです。これは、基本クラスの型で逆シリアル化している場合に発生する可能性があります。org.workplicity.marist.grounds.GroundRequest に参照しているフィールドが含まれているかどうかを確認できますか?

于 2011-03-23T18:10:32.353 に答える
0

NetBeans でのデバッグにより、JsonObject 'jentry' には、JSON 文字列の各データ メンバーに対応するキーと値のペアを持つハッシュテーブルがあることが明らかになりました。「テンプレート」はこのハッシュテーブル内にハッシュテーブルとして保存されますが、これは私が正直に見つけることができなかった問題である場合とそうでない場合があります。

それは正常です。Gson は最初に JSON オブジェクトを に読み込みますJsonObject。その中で、JSON 要素の名前と値は に格納されますLinkedHashMap。そのため、JSON 構造にオブジェクト内のオブジェクトが含まれている場合、Gson が JSON を読み込む最初の構造はJsonObjectでありLinkedHashMap、その中でエントリの 1 つが である別の値を持ちJsonObjectますLinkedHashMap

JsonObjects元の投稿では、 のマップの内容が予想外に不足していたことを明確に説明していません。デシリアライズされたデータをシリアライズした後、コンテンツの一部が欠落していることに気付いたとのみ記載されていました。問題を再現するのに十分な情報が提供されていないため、人々は問題が何であったかを推測することしかできません. そして、インダーの推測はどれよりも良さそうです。Gson の欠陥を示すものは何もありません。

「GSONを使用したJSONデシリアライゼーションは、ハッシュマップ内のハッシュマップからデータメンバーをスキップします」という質問タイトルの特定のステートメントについて、質問の残りの内容から、元の質問が実際にターゲットのJava構造がマップであったことを意味しているとは思わないマップ内。ターゲット Java 構造がマップ内のマップである場合、JSON 要素が Java フィールドに適切にバインドされていて、Gson issue 325の処理が提供されます (カスタム逆シリアル化あり)。

于 2011-06-18T22:27:04.267 に答える
0

Gson 1.7 の最新バージョンをダウンロードしてみてください。役立つ新機能がたくさん含まれています。http://groups.google.com/group/google-gson/browse_thread/thread/6272c9be58676e47#を参照してください。

1 つは、Gson がデフォルトのコンストラクターやインスタンス クリエーターを使用せずに任意のクラス インスタンスにヒープ領域を自動的に割り当てることができるため、Instance Creator が不要になったことです。

フィールドのスキップに関しては、デフォルトで、Gson はフィールドが「静的」、「一時的」、または「内部クラス」である場合、フィールドをスキップします。

于 2011-04-13T08:21:15.923 に答える