2

次のクラスでは、 Jackson 2.2を使用して .json ファイルから読み取ったモデルについて説明します。

public class Product {
    public String name;
    public int width;
}

Gradleビルド プロセスは、ProGuardを呼び出して、リリース ビルドを圧縮および難読化します。アプリケーションを起動すると、次のエラー メッセージが表示されます。

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
  Unrecognized field "name" (class com.example.b.c), 
  not marked as ignorable (0 known properties: ])

ProductJackson が引き続き機能するように、ProGuard を構成したり、クラスに注釈を付けたりするにはどうすればよいですか?

4

4 に答える 4

7

質問の例を単純化したことを管理する必要があります。この問題の解決策は、GetterとSetterをProGuardに保持することでした。Jackson を機能させるには、モデル クラスでこれらを追加で定義する必要がありました。

-keep public class com.example.models.Product {
  public *** get*();
  public void set*(***);
} 
于 2013-11-07T10:13:43.767 に答える
1

JJDの回答に基づいて構築するために、私のユースケースに役立ったのは次のとおりです。

#json contaning unobfuscated names can be read and set by Jackson
-keep public class com.xyz.yourmodel,com.xyz.c.yourmodel2,com.xyz.models.** {
    private <fields>;
    public void set*(***);
    public *** get*();
}

#to preserve Jackson annotations like @JsonIgnore
-keepclassmembers class * {
    @com.fasterxml.jackson.annotation.* *;
}

#dont throw warnings from here
-dontwarn com.fasterxml.jackson.databind.**

Androidアプリでjacksonを使用して、オブジェクトをjsonに、jsonをオブジェクトに変換しました。このアプリは、完全なフィールド名を持つ Web アプリからも json を受け取ります。Androidのプロガードはすべての名前を難読化するため、Webからjsonを処理しているときにのみエラーが発生しました。そのため、難読化されていない名前を含む json では、モデル クラスのゲッターとセッターが保持されます。

getter は setter が保持されるため、オブジェクトを json に変換する際に、jackson は難読化された名前と難読化されていない名前の両方を json に追加していました (データの複製)。それを防ぐために、モデル クラスのプライベート フィールドが保持されます。そのため、難読化されていない完全なフィールドのみが json に存在するようになりました。

注釈ルールについては、このページを参照

于 2021-12-18T16:41:54.357 に答える
0

@jsonPropertyアノテーションを使用できます

于 2013-11-08T04:56:34.303 に答える