2017-08-27 122 views
0

我想將我的JsonObject轉換爲經度和緯度的ArrayList。我一直在努力解決這個問題,但沒有任何結果。請幫忙!將JSONObjects轉換爲ArrayList

這裏是我的JSON:

{ 
    "hits":[ 
     { 
     "_geoloc":{ 
      "lat":33.842624, 
      "lng":-5.480229 
     }, 
     "objectID":"-KsPQUlvJK-PCSrH3Dq3" 
     }, 
     { 
     "_geoloc":{ 
      "lat":33.84878, 
      "lng":-5.481698 
     }, 
     "objectID":"-KsPQUloi4BAduevPJta" 
     } 
    ], 
    "nbHits":2, 
    "page":0, 
    "nbPages":1, 
    "hitsPerPage":20, 
    "processingTimeMS":1, 
    "exhaustiveNbHits":true, 
    "query":"", 
    "params":"aroundLatLng=33.62727138006218%2C-4.498191252350807&aroundRadius=545000" 
} 

這裏是我的代碼:

client.getIndex("users").searchAsync(query, new CompletionHandler() { 
    @Override 
    public void requestCompleted(JSONObject jsonObject, AlgoliaException e) { 
    } 
}); 
+0

你有沒有相應的java模型? – nullpointer

+1

創建一個相應的模型(POJO)並讓JSON庫爲你做。只有2次你想手動解析一個JSON樹:1)你按小時付費2)你有一個特殊的用例,默認的反序列化無法處理。我不知道#1,但#2似乎並不適用於此。 –

+0

這裏很少有解決方案,這取決於您可以訪問哪個庫 https://stackoverflow.com/questions/2591098/how-to-parse-json-in-java 這很可能是一個重複的問題 – Geek

回答

0

可以使用的JSONObject的成員方法來做到這一點(http://docs.oracle.com/javaee/7/api/javax/json/JsonObject.html)。例如,像下面這樣:

class GeoPoint { 
    private double lat; 
    private double lon; 
    public GeoPoint(double lat, double lon) { 
     this.lat = lat 
     this.lon = lon 
    } 
    // ... 
} 
ArrayList<GeoPoint> list = new ArrayList<>(); 
// Thankfully JsonArray objects are iterable... 
for (JsonValue e : jsonObject.getJsonArray("hits")) { 
    JsonObject coordWrapper = (JsonObject) e; 
    JsonObject coord = coordWrapper.getJsonObject("_geoloc"); 
    double lat = coord.getJsonNumber("lat").doubleValue(); 
    double lon = coord.getJsonNumber("lon").doubleValue(); 
    list.add(new GeoPoint(lat, lon)); 
} 
+0

注意:這是Java EE API,而不是Java SE,它沒有JsonObject類 –

0

如果使用fastjson爲您的JSON lib中,你可以做這樣的:

public class GeoLoc { 
    private double lng; 
    private double lat; 
    // getter & setter... 
} 

public class Geo { 
    private String objectID; 

    @JSONField(name = "_geoloc") 
    private GeoLoc geoLoc; 
    // getter & setter... 
} 

public static void main(String[] args) { 
    String jsonStr = ""; // Your json string here. 
    JSONObject jsonObject = JSON.parseObject(json); 
    JSONArray jsonArray = jsonObject.getJSONArray("hits"); 
    List<Geo> geos = jsonArray.toJavaList(Geo.class); 
    List<GeoLoc> geoLocs = geos.stream() 
      .map(Geo::getGeoLoc) 
      .collect(Collectors.toList()); 
} 

無需轉換明確列出,FASTJSON做它您。