2015-08-10 16 views
8

Tôi đang phát triển một ứng dụng Android đang gửi JSON bằng cách sử dụng Android Retrofit (nó chuyển đổi một lớp POJO thành JSON). Nó hoạt động tốt, nhưng tôi cần bỏ qua trong việc gửi một phần tử JSON từ lớp POJO.Làm thế nào để bỏ qua một phần tử JSON trong Android Retrofit

Có ai biết bất kỳ chú thích Retrofit Android nào không?

Ví dụ

POJO Class:

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; 
    } 


} 

Interface Sender ApiClass

public interface SvcApi { 

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

} 

Bất kỳ ý tưởng làm thế nào để bỏ qua Text2?

+1

Gần đây, tôi đã làm việc trên thư viện Retrofit. Và theo như kiến ​​thức của tôi là có liên quan nếu bạn loại bỏ 'text2' khỏi lớp POJO của bạn, json yêu cầu sẽ không ánh xạ giá trị chuỗi đó vào mô hình của bạn. Theo thứ tự từ nó sẽ bị bỏ qua. –

+0

Có, tất nhiên, nhưng tôi cần biến 'text2' này trong lớp POJO để sử dụng nó trong ứng dụng android, tôi chỉ cần bỏ qua 'text2' này trong JSON. –

Trả lời

7

Tôi tìm thấy giải pháp thay thế nếu bạn không muốn sử dụng new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().

Chỉ cần bao gồm transient trong biến tôi cần bỏ qua.

Vì vậy, lớp POJO cuối cùng:

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; 
    } 
} 

Tôi hy vọng nó giúp

+1

Đó là "chuỗi văn bản tạm thời2" thay vì "Chuỗi văn bản tạm thời2". Cảm ơn bạn. – Alex

+0

Tôi không chắc chắn, điều này anwser tốt hơn so với @nikhil.thakkar đã viết. Ví dụ, lớp hiện tại có thể thực hiện Serializable quá và tôi muốn, ví dụ, bỏ qua trường text2 trong JSON và không bỏ qua trên serialization. –

9

Đánh dấu các trường mong muốn với chú thích @Expose, chẳng hạn như:

@Expose private String id; 

Bỏ bất kỳ lĩnh vực mà bạn không muốn serialize. Sau đó, chỉ cần tạo đối tượng Gson theo cách này:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 
+0

Nó có thể là một lựa chọn tốt mà có lẽ tôi sẽ làm để giải quyết vấn đề của tôi, nhưng những gì tôi muốn làm là duy trì giao diện Retrofit xây dựng các JSON tự động. –

+1

Bạn có thể đặt trình chuyển đổi tùy chỉnh trong trang bị thêm. Nó được hỗ trợ theo mặc định. Tham khảo tại đây http://square.github.io/retrofit/ –

+1

Bằng cách sử dụng @Expose chú thích trên các trường của bạn và định cấu hình trang bị thêm bằng cách sử dụng trình tạo GSON như thế này, bạn có thể bỏ qua các phần tử: .addConverterFactory (GsonConverterFactory.create (GsonBuilder () .excludeFieldsWithoutExposeAnnotation(). create())) –

1

Bạn có thể cấu hình Retrofit bằng cách thêm các đối tượng GSON từ GSONBuilder vào ConverterFactory bạn, hãy xem ví dụ của tôi dưới đây:

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

Để bỏ qua các phần tử trường, chỉ cần thêm @Expose (deserialize = false, serialize = false) vào thuộc tính của bạn hoặc không, và để (de) tuần tự hóa các phần tử trường bạn c thêm chú thích @Expose() với các giá trị rỗng vào các thuộc tính của bạn.

@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. 
Các vấn đề liên quan