2016-07-11 4 views
1

Ich probiere die Opensignal-API aus und bin in eine Wand gelaufen, als ich versucht habe, Jackson 2.0 zu verwenden, um das Ergebnis zu serialisieren. Die networkRank kann ein Array sein oder es kann eine ZeichenfolgeSerialisierung von JSON mit Varing-Datentyp mit der gleichen Variablen

sein Wie könnte ich Jackson gesetzt JSON richtig serialisiert werden, wie wenn es ein String ist, ist es auf diese String networkRank speichern anderes Attribut speichern zu List <NetworkRank> = new ArrayList<NetworkRank>()

Diese resultieren sind ihrer api: (unten networkRank out)

{ 
    "apiVersion": "2", 
    "latitude": "14.55669", 
    "longitude": "121.370119", 
    "distance": "10", 
    "network_type": "10", 
    "perMinuteCurrent": 0, 
    "perMinuteLimit": 10, 
    "perMonthCurrent": 7, 
    "perMonthLimit": 2000, 
    "networkRank": "No results for this area" 
} 

und

{ 
    "apiVersion": "2", 
    "latitude": "14.55669", 
    "longitude": "121.370119", 
    "distance": "10", 
    "network_type": "10", 
    "perMinuteCurrent": 0, 
    "perMinuteLimit": 10, 
    "perMonthCurrent": 7, 
    "perMonthLimit": 2000, 
    "networkRank": [ 
     { 
     "networkName": "T-Mobile", 
     "networkId": "310260", 
    "type3G": { 
    "networkName": "T-Mobile", 
    "networkId": "310260", 
    "networkType": "3", 
    "averageRssiAsu": "10.934899", 
    "averageRssiDb": "-91.130203", 
    "sampleSizeRSSI": "437532", 
    "downloadSpeed": "4532.8305", 
    "uploadSpeed": "1124.9649", 
    "pingTime": "148.8205", 
    "reliability": "94.5944170771741" 
    }, 
    "type4G": { 
    "networkName": "EE", 
    "networkId": "23430", 
    "networkType": "4", 
    "averageRsrpAsu": "33.865632", 
    "averageRsrpDb": "-106.134368", 
    "sampleSizeRSRP": "284041", 
    "downloadSpeed": "9851.1000", 
    "uploadSpeed": "4377.3200", 
    "pingTime": "87.0000", 
    "reliability": "96.2113095238094" 
    } 
    } 
    ] 
} 
+0

Wie sieht die Klasse für die Serialisierung aus? Meinst du, es gibt ein 'Object'-Feld von' networkRank', das entweder 'String' oder' List '' sein kann? – Wilson

+0

Hallo Wilson, der Web-Service ergibt Array von Netzwerkrang, wenn Netzwerksignal existiert, sonst sendet es kein Netzwerksignal als String gefunden. So wird das gleiche Feld zu einer Zeichenfolge oder einem Array. –

+0

Sounds Sie müssen die JSON-Antwort in ein Klassenobjekt deserialisieren? Wenn das der Fall ist, wie sieht die Klasse für die Deserialisierung aus? oder eine Klassenstruktur ist willkommen, solange nach der Deserialisierung ein Feld zum Speichern einer Zeichenfolge oder eines Arrays vorhanden ist? – Wilson

Antwort

3

der einfachste Weg zu uns Dasselbe Feld für eine JSON-Zeichenfolge oder ein Array ist wahrscheinlich ein Object-Feld zu verwenden. Diese Lösung benötigt keinen benutzerdefinierten Serializer und Deserializer. Es folgt ein Beispiel-Klasse mit Jackson Anmerkung:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) 
public class NetworkStatistics { 

    private String apiVersion; 
    private String latitude; 
    private String longitude; 
    private String distance; 
    @JsonProperty("network_type") 
    private String networkType; 
    private int perMinuteCurrent; 
    private int perMinuteLimit; 
    private int perMonthCurrent; 
    private int perMonthLimit; 
    private Object networkRank; 

    public NetworkStatistics() { 
    } 

    // getters 
} 

Es folgt ein Beispiel einer JSON-String der api Antwort in NetworkStatistics Instanz deserialisieren:

ObjectMapper mapper = new ObjectMapper(); 
NetworkStatistics networkStatistics = mapper.readValue(json, NetworkStatistics.class); 

und ein Beispiel NetworkStatistics Instanz in json String serialisiert :

String json = mapper.writeValueAsString(networkStatistics)) 

Wenn networkRank in json einen String-Wert ist, das Instanzfeld nach deser ialization wird ein String Feld sein. Wenn es sich um ein JSON-Array handelt, ist das Instanzfeld ein java.util.ArrayList-Feld.

Hoffe, das kann helfen.

+0

Es funktioniert! Vielen Dank! Wenn ich fragen darf, wie würde der Getter-Code aussehen, so dass ich beim Abrufen der Daten kein Casting verwenden muss? Oder sollte ich 2 Getter-Methoden haben? –

+1

Sie können 2 weitere Getter-Methoden wie 'getNetworkRankAsString()' und 'getNetworkRankAsList()' verwenden, um eine 'String' bzw. eine' List' zurückzugeben. Wenn Sie die meiste Zeit mit einer 'List' arbeiten, ist es sinnvoll, eine leere Liste von' getNetworkRankAsList() 'zurückzugeben, wenn' networkRank' eine Zeichenkette ist (mit 'instanceof'). – Wilson

Verwandte Themen