web-dev-qa-db-ja.com

Android RetrofitのJSON要素を無視する方法

Androidアプリを開発していますAndroid Retrofitを使用してJSONを送信しているアプリ(POJOクラスをJSONに変換します)。これは正常に動作していますが、 JSONの送信では、POJOクラスからの1つの要素を無視する必要があります。

Android Retrofitアノテーションを知っている人はいますか?

POJOクラス:

public class sendingPojo
{
   long id;
   String text1;
   String text2;//--> I want to ignore that in the JSON

   getId(){return id;}
   setId(long id){
     this.id = id;
   }

   getText1(){return text1;}
   setText1(String text1){
     this.text1 = text1;
   }

   getText2(){return text2;}
   setText2(String text2){
     this.text2 = text2;
   }


}

インターフェース送信者ApiClass

 public interface SvcApi {

 @POST(SENDINGPOJO_SVC_PATH)
 public sendingPojo addsendingPojo(@Body sendingPojo sp);

}

text2を無視する方法はありますか?

19
Alberto Crespo

new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()を使用したくない場合は、別の解決策を見つけました。

無視する必要がある変数にtransientを含めるだけです。

それで、POJOクラスは最終的に:

public class sendingPojo {
    long id;
    String text1;
    transient String text2;//--> I want to ignore that in the JSON

    getId() {
        return id;
    }

    setId(long id) {
        this.id = id;
    }

    getText1() {
        return text1;
    }

    setText1(String text1) {
        this.text1 = text1;
    }

    getText2() {
        return text2;
    }

    setText2(String text2) {
        this.text2 = text2;
    }
}

それが役に立てば幸い

15
Alberto Crespo

次のように、@ Exposeアノテーションで必要なフィールドをマークします。

@Expose private String id;

シリアル化したくないフィールドは省略してください。次に、この方法でGsonオブジェクトを作成します。

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
14
nikhil.thakkar

GSONBuilderからGFactoryオブジェクトをConverterFactoryに追加することで、レトロフィットを構成できます。以下の例を参照してください。

private static UsuarioService getUsuarioService(String url) {
    return new Retrofit.Builder().client(getClient()).baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create(getGson())).build()
            .create(UsuarioService.class);
}

private static OkHttpClient getClient() {
    return new OkHttpClient.Builder().connectTimeout(5, MINUTES).readTimeout(5, MINUTES)
            .build();
}

private static Gson getGson() {
    return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
}

フィールド要素を無視するには、@ Expose(deserialize = false、serialize = false)をプロパティまたはなしに追加し、フィールド要素を(非)シリアル化するには、空の値を持つ@Expose()アノテーションをプロパティに追加します。

@Entity(indexes = {
        @Index(value = "id DESC", unique = true)
})
public class Usuario {

    @Id(autoincrement = true)
    @Expose(deserialize = false, serialize = false) 
    private Long pkey; // <- Ignored in JSON
    private Long id; // <- Ignored in JSON, no @Expose annotation
    @Index(unique = true)
    @Expose
    private String guid; // <- Only this field will be shown in JSON.

Kotlin + Retrofit + Moshiを使用している場合(私はこれをテストしました)条件付きでフィールドを無視する場合は、nullに設定できます。

data class  User(var id: String,  var name: string?)

val user = User()
user.id = "some id"
user.name = null

生成されるJsonは

user{
"id": "some id"
}
2
Bellan