Der beste Ansatz ist „Da“ und „Bis“ Anmerkungen für diesen Anwendungsfall zu verwenden. Wenn Sie das Gson-Objekt erstellen, kann die Version festgelegt werden. Die API serialisiert oder deserialisiert basierend auf der Anmerkung @Since
und @Until
Anmerkungen und Versionsnummer.
Ein großer Vorteil dieses Ansatzes der Verwendung: -
Die Gson Version kann in Auftragungseigenschaft Datei beibehalten werden. Der Code kann mit der Version 1.0 oder 1.1 basierend auf der Anforderung ausgeführt werden, wenn Sie eine Abhängigkeit z. jede andere Schnittstelle, Webdienste usw.
Dies ist die Standard Best Practice zur Unterstützung mehrerer Versionen von JSON.
Gson gsonv10 = new GsonBuilder().setVersion(1.0).create();
@since - Eine Anmerkung, die die Versionsnummer gibt da ein Mitglied oder ein Typ vorhanden war.
@Until - Eine Anmerkung, die die Versionsnummer angibt, bis ein Element oder ein Typ vorhanden sein sollte.
JSON Objekt -
public static void main(String[] args) {
String version10Json = "{\"name\": \"v19\",\"timestamp\" : 1475733360000,\"type\": \"long\",\"value\": 123}";
String version11Json = "{\"metrics\":[{\"name\":\"v19\",\"timestamp\":1475733360000,\"type\":\"long\",\"value\":123}],\"meta_data\":{\"timestamp\":1474367139000,\"count\":{\"app1\":120}}}";
Gson gsonv10 = new GsonBuilder().setVersion(1.0).create();
Gson gsonv11 = new GsonBuilder().setVersion(1.1).create();
System.out.println("Using v11 on v11 JSON ==>" + gsonv11.fromJson(version11Json, MetricRootObject.class));
System.out.println("Using v10 on v10 JSON ==>" + gsonv10.fromJson(version10Json, MetricRootObject.class));
System.out.println("Using v10 on v11 JSON ==>" + gsonv10.fromJson(version11Json, MetricRootObject.class));
System.out.println("Using v11 on v10 JSON ==>" + gsonv11.fromJson(version10Json, MetricRootObject.class));
}
POJO-Klasse: -
public class MetricRootObject implements Serializable{
private static final long serialVersionUID = -8304164167299285496L;
@Until(1.1)
private String name;
@Until(1.1)
private Long timestamp;
@Until(1.1)
private String type;
@Since(1.1)
private List<Metrics> metrics;
@Since(1.1)
@SerializedName("meta_data")
private MetaData metaData;
@Until(1.1)
private Integer value;
@Override
public String toString() {
return "MetricRootObject [name=" + name + ", timestamp=" + timestamp + ", type=" + type + ", metrics=" + metrics
+ ", metaData=" + metaData + ", value=" + value + "]";
}
}
public class Metrics implements Serializable{
private static final long serialVersionUID = -8304164167299285496L;
@Since(1.1)
private String name;
@Since(1.1)
private Long timestamp;
@Since(1.1)
private String type;
@Since(1.1)
private Integer value;
@Override
public String toString() {
return "Metrics [name=" + name + ", timestamp=" + timestamp + ", type=" + type + ", value=" + value + "]";
}
}
public class MetaData implements Serializable{
private static final long serialVersionUID = 4332864980951634867L;
@Since(1.1)
private Long timestamp;
@Since(1.1)
@SerializedName("count")
private MetricsCount count;
@Override
public String toString() {
return "MetaData [timestamp=" + timestamp + ", count=" + count + "]";
}
}