2017-01-31 3 views
1

Nach meinem Verständnis von @Until Annotation in der Dokumentation definiert, unterstützt es alle Version bis zur Version enthalten in der Anmerkung.@Unter Annotation in Gson funktioniert nicht wie erwartet

Docs:

public class User { 
    private String firstName; 
    private String lastName; 
    @Until(1.1) private String emailAddress; 
    @Until(1.1) private String password; 
} 

wenn Sie Gson mit Gson Gson = new GsonBuilder() setVersion (1.2) .Create() erstellt dann die toJson() und fromJson() Methoden. von Gson wird die Felder emailaddress und password aus dem obigen Beispiel ausschließen, da die Versionsnummer, die an der GsonBuilder, 1.2 übergeben wird, die Versionsnummer überschreitet, die für diese Felder in der Annotation Until festgelegt ist.

Also, wenn mein Gson mit Version 1.1 gebaut wurde, sollte es alle 4 Felder der Klasse anzeigen. Dies ist jedoch nicht der Fall.

meine Klasse:

class TestData { 
    private String firstName; 

    @Since(1.1) 
    private String middleName; 

    @Until(1.1) 
    private String lastName; 
} 

Testcode:

TestData testData = new TestData(); 
testData.setFirstName("first"); 
testData.setMiddleName("middle"); 
testData.setLastName("last"); 
Gson versionGson = new GsonBuilder().setPrettyPrinting().setVersion(1.1).create(); 
System.out.println(versionGson.toJson(testData)); 

Ausgang:

{ 
    "firstName": "first", 
    "middleName": "middle" 
} 

lastName ist mis sing in der Ausgabe, obwohl der Annotation-Wert der Gson-Version entspricht.

Weitere Debugging Ich fand this unter gson Code, der dieses Verhalten verursacht hat. Natürlich, nach Code, obwohl meine Annotation-Version mit der Version übereinstimmt, die an Gson übergeben wurde, gilt sie immer noch als ungültig.

private boolean isValidUntil(Until annotation) { 
    if (annotation != null) { 
     double annotationVersion = annotation.value(); 
     if (annotationVersion <= version) { 
     return false; 
     } 
    } 
    return true; 
    } 

Ist der Doc, Code oder mein Verständnis falsch?

+0

Wo ist das Feld 'someName'? – CKing

+0

@CKing Es ist nicht da.Ich entfernte unnötige Felder aus dem POJO beim Einfügen, editierte die Frage mit dem gleichen. –

Antwort

0

Die javadoc Staaten

Eine Anmerkung, die die Versionsnummer, bis ein Mitglied oder ein Typ sollte vorhanden sein, anzeigt. Grundsätzlich Wenn Gson mit einer Version Nummer erstellt wird, die den in der Until Annotation gespeicherten Wert überschreitet, wird das Feld von der JSON-Ausgabe ignoriert.

aber die code returns "ungültig", wenn die Version überschreitet oder gleich die Version, die Sie in @Until angeben.

Dies scheint wie ein Fehler im Code für mich (wenn Sie davon ausgehen, dass die API-Spezifikation die Quelle der Wahrheit ist). Ich habe eine issue geöffnet, um dies zu verfolgen.

Verwandte Themen