2016-10-12 5 views
0

Ich habe ein JSON wie folgt aus:Rückwärtskompatibilität json verschiedener Typen in Gson Objekt Leser beim Lesen

{ 
    "name": "v19", 
    "timestamp" : 1475733360000, 
    "type": "long", 
    "value": 123 
} 

Und das neue JSON-Format ist, dass die oben innen geht metrics Array und meta_data angefügt:

{ 
    "metrics": [ 
    { 
     "name": "v19", 
     "timestamp" : 1475733360000, 
     "type": "long", 
     "value": 123 
    } 
    ], 
    "meta_data": { 
    "timestamp" : 1474367139000, 
    "count": { 
     "app1" : 120 
    } 
    } 
} 

Verwenden Sie try-catch ist die einzige Möglichkeit, beide Arten von JSON zu behandeln? Oder gibt es einen besseren Weg?

Im Moment sieht mein Code wie folgt:

switch (reader.peek()) 
{ 
    case BEGIN_OBJECT: 
     try 
     { 
      MetaDataMetric metaMetric = parseMetaMetric(reader); 
     } 
     catch 
     { 
      NewMetric metric = parseMetric(reader); 
     } 
     break; 
} 

Antwort

0

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 + "]"; 
    } 
}