2016-07-05 89 views
0

所以我有這個問題與Gson我只是無法弄清楚。GSON商店Json鍵字符串變量

想象一下處理票據的Json結構。 JSON的是這樣的:

{ 
    "concertTicket" : { ... some valid json object ... } 
} 

,我寫我的解析器是這樣的:

@SerializedName("concertTicket") 
JsonObject ticketContent; 

這很簡單。現在我有一個名爲ticketContent的JsonObject,它存儲與票相關的東西。

到目前爲止這麼好......現在正好有三種不同的門票:我們假設concertTicket,planeTicketmuseumTicket

我想實現的是帶有兩個變量的解析器。一個存儲ticketType,另一個存儲ticketContents

我想通了解析器爲ticketContent

@SerializedName(value="concertTicket", alternate={"planeTicket", "museumTicket"}) 
JsonObject ticketContent; 

我的問題是現在:是否可以寫一個返回一個名爲ticketType變量的JSON-Key作爲字符串註釋?像這樣:

@ ... what to put here ? ... 
String ticketType; 

這樣

如果其concertTicketticketType = "concertTicket"值, 如果其planeTicketticketType = "planeTicket"價值和 如果其museumTicketticketType = "museumTicket"價值?

---這裏是我的解決辦法---

@SerializedName("concertTicket") 
private JsonObject concertTicket; 
@SerializedName("planeTicket") 
private JsonObject planeTicket; 
@SerializedName("museumTicket") 
private JsonObject museumTicket; 

public enum TicketType { 
    concertTicket, planeTicket, museumTicket 
} 

/* 
* since only one of the TicketTypes can be not null, return this as TicketType 
*/ 
public TicketType getTicketType() { 
    if (concertTicket != null) { 
     return TicketType.concertTicket; 
    } 
    if (planeTicket != null) { 
     return TicketType.planeTicket; 
    } 
    if (museumTicket != null) { 
     return TicketType.museumTicket; 
    } 
    return null; 
} 

/* 
* since only one of the TicketTypes can be not null, return this as content 
*/ 
public JsonObject getTicketContent() { 
    if (concertTicket != null) { 
     return concertTicket; 
    } 
    if (planeTicket != null) { 
     return planeTicket; 
    } 
    if (museumTicket != null) { 
     return museumTicket; 
    } 
    return null; 
} 

但我不知道是否有一個更優雅的解決方案呢?

回答

0

如果你有3票,讓說: concertTicket,planeTicket和museumTicket 那麼應該有一個共同的父/共同的超類或接口...

如果是這樣;那麼你可以反序列化的接口,然後投給票的種類..

例子:

interface Iticket { 
    void printTicket(); 
} 


public class Ticket implements Iticket { 
    protected String id; 
    protected int price; 

    public static void main(String[] args) { 
    String ticketString = "{\"id\":\"0000\", \"price\":15}"; 
    Gson g = new Gson(); 
    Ticket c = g.fromJson(ticketString, Concert.class); 
    ((Concert) c).jump(); 
    Ticket m = g.fromJson(ticketString, Museum.class); 
    ((Museum) m).niddle(); 

    } 

    @Override 
    public void printTicket() { 
    // TODO Auto-generated method stub 

    } 

} 

class Concert extends Ticket implements Iticket { 

    @Override 
    public void printTicket() { 
    // 
    System.out.println("Loud printer"); 
    } 

    public void jump() { 
    System.out.println("jump"); 
    } 
} 

class Museum extends Ticket implements Iticket { 

    @Override 
    public void printTicket() { 
    System.out.println("Boring printer"); 
    } 

    public void niddle() { 
    System.out.println("niddle"); 
    } 
} 
+0

我並不認爲這不是一個好主意。但Json不在我的控制之下。爲了清楚起見,我不關心作爲爭論的類別的相似之處,我只關心關鍵。 – grAPPfruit