当 2 个条件为真时从 JSON 获取值

Posted

技术标签:

【中文标题】当 2 个条件为真时从 JSON 获取值【英文标题】:Get value from JSON when 2 condition are true 【发布时间】:2018-10-10 04:45:20 【问题描述】:

我在我的应用程序中使用 Google 地图,并通过从 JSON 获取纬度和经度向地图添加标记,我的 JSON 如下所示:

[
  
    "name": "Hotel 1"
    "lat": "39.323523",
    "long": "-3.036840"
  ,
  
    "name": "Hotel 2"
    "lat": "39.323523",
    "long": "-2.937963"
  
]

这很好用,标记已按应有的方式设置。现在,当我点击标记时,我会得到纬度和经度,但会执行以下操作:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() 
        @Override
        public boolean onMarkerClick(Marker marker) 

            //Getting the lat and long based on marker position clicked
            Double latitude = marker.getPosition().latitude;
            Double longitude = marker.getPosition().longitude;

            return false;
        
    );

这也很好,每当我点击标记时,我都会得到正确的纬度和经度。


这是我的问题开始的地方;如果 2 个值是真的,我现在要做的是从我的 JSON 文件中获取名称。在我的mMap.setOnMarkerClickListener 我称之为:

getInfoJson("39.323523", "-3.036840");

所以,如果纬度是39.323523,经度是-3.036840,那么我想得到名字。

这是我的方法:

private void getInfoJson(final String lati, final String longi) 
    StringRequest stringRequest = new StringRequest(Request.Method.GET,
            URL_DATA,
            new Response.Listener<String>() 
                @Override
                public void onResponse(String s)                         
                    try 
                        JSONArray array = new JSONArray(s);
                        for (int i = 0; i < array.length(); i++) 
                            JSONObject o = array.getJSONObject(i);
                            //Getting lat and long from JSONObject
                            mLat = o.getString("lat");
                            mLong = o.getString("long");
                        
                     catch (JSONException e) 
                        e.printStackTrace();
                    
                
            , new Response.ErrorListener() 
        @Override
        public void onErrorResponse(VolleyError volleyError) 
            Toast.makeText(getContext(), volleyError.getMessage(), Toast.LENGTH_LONG).show();
        
    );
    RequestQueue requestQueue = Volley.newRequestQueue(getContext());
    requestQueue.add(stringRequest);

有人处理过这个问题吗?有人可以澄清一下这是怎么可能的吗?

【问题讨论】:

使用String类的.equals方法。 只是确认一下,GET 请求会获取您想要解析的 JSON 数组,以查看纬度和经度是否匹配?如果他们想返回名字? @casualcoder 抱歉,我错过了您的评论,是的,这正是我想要实现的目标。 【参考方案1】:

试试:

private void getInfoJson(final String lati, final String longi) 
    StringRequest stringRequest = new StringRequest(Request.Method.GET,
            URL_DATA,
            new Response.Listener<String>() 
                @Override
                public void onResponse(String s)                         
                    try 
                        JSONArray array = new JSONArray(s);
                        for (int i = 0; i < array.length(); i++) 
                            JSONObject o = array.getJSONObject(i);
                            //Getting lat and long from JSONObject
                            mLat = o.getString("lat");
                            mLong = o.getString("long");
                            if(lati.equals(mLat) && longi.equals(mLong)) 
                            
                               //get name here
                               name = o.getString("name");
                            else 

                            
                        
                     catch (JSONException e) 
                        e.printStackTrace();
                    
                
            , new Response.ErrorListener() 
        @Override
        public void onErrorResponse(VolleyError volleyError) 
            Toast.makeText(getContext(), volleyError.getMessage(), Toast.LENGTH_LONG).show();
        
    );
    RequestQueue requestQueue = Volley.newRequestQueue(getContext());
    requestQueue.add(stringRequest);

************** 编辑 *****************

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() 
        @Override
        public boolean onMarkerClick(Marker marker) 

            GoogleMap.OnMarkerClickListener listener = (GoogleMap.OnMarkerClickListener) marker.getTag();

            //Getting the lat and long based on marker position clicked
            Double latitude = marker.getPosition().latitude;
            Double longitude = marker.getPosition().longitude;

            getInfoJson(latitude, longitude);

            return listener != null && listener.onMarkerClick(marker);
        
    );

【讨论】:

感谢您的回答,我试过了,无论点击什么标记它都会返回名称,我只想在选择具有相应经度和经度的标记时返回名称。 现在它只在点击一个标记时返回,我认为问题可能是因为 for 循环应该被打破break;?? @ClassA 也尝试在点击列表中输入日志,看看是否每次都拉长 @ClassA 在这个答案中,我已经检查了地图 lat long 和 json lat long 如果两者都匹配然后获取名称,否则我什么也没做。所以在这种情况下,只有当两个 lat long 匹配时才会返回名称。这就是你需要的吗? 让我用我的尝试和结果更新我的问题

以上是关于当 2 个条件为真时从 JSON 获取值的主要内容,如果未能解决你的问题,请参考以下文章

当地图的条件为真时,我只需要将结果分配给“值”

如何将一个观察值与先前的观察值相乘,但仅当某个条件为真时

当应该为真时,Android Studio 改造响应返回布尔值为假

当其他可观察对象为真时,从可观察对象中获取项目

当条件为真时,ios 禁用后退按钮是不是是一种良好的用户体验?

当条件为真时,Pandas将数据帧分成多个