2015-08-10 8 views
8

Ich entwickle eine Android App, die ein JSON mit Android Retrofit sendet (es konvertiert eine POJO-Klasse in einem JSON). Es funktioniert gut, aber ich muss beim Senden von JSON ein Element aus der POJO-Klasse ignorieren.Wie ignoriere ich ein JSON-Element in Android Retrofit

Kennt jemand eine Android Retrofit Annotation?

Beispiel

POJO Klasse:

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


} 

Schnittstelle Sender ApiClass

public interface SvcApi { 

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

} 

Jede Idee, wie text2 zu ignorieren?

+1

Ich habe kürzlich an Retrofit-Bibliothek gearbeitet. Und soweit es mein Wissen betrifft, wenn Sie 'text2' aus Ihrer POJO-Klasse entfernen, wird der Anfrage-json diesen String-Wert nicht Ihrem Modell zuordnen. In den Wörtern wird es ignoriert. –

+0

Ja, natürlich, aber ich brauche diese 'text2'-Variable in der POJO-Klasse, um sie in der Android-App zu verwenden, ich muss nur' text2 'in JSON ignorieren. –

Antwort

7

ich eine alternative Lösung gefunden, wenn Sie nicht new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create() verwenden wollen.

Nur transient in die Variable, die ich ignorieren muss.

Also, die POJO Klasse schließlich:

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

Ich hoffe, es

+1

Es ist "transient String text2" anstelle von "String transient text2". Vielen Dank. – Alex

+0

Ich bin mir nicht sicher, dass dies besser als @nikhil.Thakkar schrieb. Die aktuelle Klasse kann beispielsweise auch Serializable implementieren, und ich möchte beispielsweise das Feld text2 in JSON ignorieren und bei der Serialisierung nicht ignorieren. –

9

Markieren Sie die gewünschten Felder mit der @Expose Anmerkung, wie zum Beispiel:

@Expose private String id; 

alle Felder verlassen, die Sie wollen nicht serialisiert werden. Dann erstellen Sie einfach Ihre Gson Objekt auf diese Weise:

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

Es könnte eine gute Alternative sein, die ich vielleicht nehmen werde, um mein Problem zu lösen, aber was ich tun möchte, ist die Pflege der Retrofit-Schnittstelle, die die JSONs automatisch erstellt. –

+1

Sie können einen benutzerdefinierten Konverter in Retrofit einstellen. Es wird standardmäßig unterstützt. Siehe http://square.github.io/retrofit/ –

+1

Indem Sie @ Expose-Anmerkungen in Ihren Feldern verwenden und die Nachrüstung mit dem GSON-Builder konfigurieren, können Sie folgende Elemente ignorieren: .addConverterFactory (GsonConverterFactory.create (GsonBuilder () .excludeFieldsWithoutExposeAnnotation(). create())) –

1

hilft Ihnen Retrofit durch Hinzufügen des Objekts Gson konfigurieren können vom GSONBuilder in Ihre ConverterFactory, siehe mein Beispiel unten:

Um die Feldelemente zu ignorieren, fügen Sie einfach @Expose (deserialize = false, serialize = false) zu Ihren Eigenschaften hinzu oder none, und für (de) serialisieren Sie Ihre Feldelemente, die Sie c Fügen Sie die @Expose() - Annotationen mit leeren Werten zu Ihren Eigenschaften hinzu.

@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.