2016-07-11 4 views
1

私はOpensignal APIを試していて、Jackson 2.0を使用して結果をシリアル化しようとしているときに壁にぶつかっています。 networkRankは配列であり得るか、または他の属性私はこのString networkRankに保存し、それが文字列だ場合のように、ジャクソンは、適切にJSONをシリアル化するために設定することができますどのように文字列同じ変数を持つvaringデータ型を使用してJSONをシリアライズ

することができ、これらは結果であるList <NetworkRank> = new ArrayList<NetworkRank>()

に保存(以下networkRankをチェックしてください)

{ 
    "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" 
} 

{ 
    "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

シリアライズルックのクラスはどのようなものですか? 'network''の' Object'フィールドは 'String'か' List 'のどちらかになりますか? – Wilson

+0

こんにちはウィルソン、ネットワークサービスは、ネットワーク信号が存在する場合はネットワークランクの配列になり、それ以外の場合は文字列として検出されたネットワーク信号は送信されません。したがって、同じフィールドは文字列または配列になります。 –

+0

JSONレスポンスをクラスオブジェクトに逆シリアル化する必要がありますか?その場合、あなたはどのような非直列化のためのクラスですか?デシリアライズ後に文字列や配列を格納するフィールドが同じであれば、どんなクラス構造でも構いませんか? – Wilson

答えて

3

、私たちに最も簡単な方法:そのAPIのjson文字列または配列の同じフィールドはおそらくObjectフィールドを使用しています。このソリューションには、カスタムシリアライザとデシリアライザは必要ありません。以下は、ジャクソン注釈付き例のクラスである:以下

@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 
} 

NetworkStatisticsインスタンスにAPIレスポンスのJSON文字列をデシリアライズするための例である:

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

とJSON文字列にNetworkStatisticsインスタンスをシリアル化する例:JSONで

String json = mapper.writeValueAsString(networkStatistics)) 

networkRankの場合はdeser後に文字列値、インスタンスフィールドでありますializationはStringフィールドになります。 json配列の場合、インスタンスフィールドはjava.util.ArrayListフィールドになります。

これは役に立ちます。

+0

それは動作します!ありがとう!私が尋ねるかもしれない場合、データを取得するときにキャストを使用する必要がないようにゲッターコードはどのように見えるでしょうか?または、私は2つのゲッターメソッドをinteadにする必要がありますか? –

+1

'getNetworkRankAsString()'や 'getNetworkRankAsList()'のようなgetterメソッドを2つ追加して、 'String'と' List'をそれぞれ返すことができます。ほとんどの場合、 'List'を使って作業する場合、' networkRank'が(instanceof'を使って)文字列であれば 'getNetworkRankAsList()'から空のリストを返すと便利です。 – Wilson

関連する問題