如何在满足两个条件时从JSON取值(结合Google Maps场景)
实现点击标记并满足条件时获取JSON对应值的方案
嘿,我来帮你搞定这个需求!你已经搞定了标记显示和点击获取经纬度,接下来要做的就是把标记和对应的JSON数据关联起来,再加上条件判断就行,步骤很清晰:
1. 先把JSON数据转换成实体类对象列表
首先别直接用原始的JSON字符串操作,咱们把它转换成Java对象,这样后续拿数据超方便。首先创建一个Hotel实体类(注意long是Java关键字,所以把属性名改成longitude或者lon):
public class Hotel { private String name; private String lat; private String longitude; // 避开Java关键字long // 生成getter、setter方法和构造函数 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLat() { return lat; } public void setLat(String lat) { this.lat = lat; } public String getLongitude() { return longitude; } public void setLongitude(String longitude) { this.longitude = longitude; } }
然后用Gson(或者你习惯的JSON解析库)把你的JSON字符串转换成List<Hotel>:
String jsonStr = "[ { \"name\": \"Hotel 1\", \"lat\": \"39.323523\", \"long\": \"-3.036840\" }, { \"name\": \"Hotel 2\", \"lat\": \"39.323523\", \"long\": \"-2.937963\" } ]"; Gson gson = new Gson(); Type listType = new TypeToken<List<Hotel>>(){}.getType(); List<Hotel> hotelList = gson.fromJson(jsonStr, listType);
2. 添加标记时关联对应的Hotel对象
在你添加Marker到地图的时候,把对应的Hotel对象存到Marker的Tag里,这样点击标记时就能直接拿到这个对象:
for (Hotel hotel : hotelList) { double latitude = Double.parseDouble(hotel.getLat()); double longitude = Double.parseDouble(hotel.getLongitude()); Marker marker = mMap.addMarker(new MarkerOptions() .position(new LatLng(latitude, longitude)) .title(hotel.getName())); // 把Hotel对象绑定到Marker上 marker.setTag(hotel); }
3. 在点击事件里判断条件并获取对应值
现在在你的OnMarkerClickListener里,先拿到标记对应的Hotel对象,然后根据你的两个条件判断,满足的话就获取对应的值。比如假设你的条件是:纬度等于39.323523 且 名称包含"Hotel",代码如下:
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { // 从Marker的Tag里取出对应的Hotel对象 Hotel clickedHotel = (Hotel) marker.getTag(); if (clickedHotel != null) { // 替换成你的两个具体条件 boolean condition1 = "39.323523".equals(clickedHotel.getLat()); boolean condition2 = clickedHotel.getName().contains("Hotel"); if (condition1 && condition2) { // 满足条件,获取你需要的对应值 String hotelName = clickedHotel.getName(); String hotelLat = clickedHotel.getLat(); String hotelLon = clickedHotel.getLongitude(); // 这里可以做你需要的操作,比如弹窗显示、存储数据等 Log.d("HotelInfo", "满足条件的酒店:" + hotelName + ",经纬度:" + hotelLat + "," + hotelLon); } } return false; // 返回false让地图默认处理点击事件(比如显示InfoWindow) } });
这样操作的好处是不用每次点击都去遍历整个JSON列表找对应数据,直接通过Marker的Tag关联对象,效率更高也更简洁。你只需要把代码里的condition1和condition2替换成你实际需要的判断逻辑就行啦!
内容的提问来源于stack exchange,提问作者ClassA
相关产品推荐
相关产品推荐

