2017-08-27 85 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做它您。