从JSON检索数据?

时间:2017-11-19 09:06:29

标签: android arrays json

我试图从第一个网址获得所有物种的结果,但遗憾的是,我的for循环只能从我的第一个网址检索一个物种,而我不知道这里的正确逻辑是什么。希望您能够帮助我。我知道问题是我的循环,但我不知道如何正确构建它。抱歉。新手在这里。

search_species = txtSearchMap.getText().toString();
    String url = 
"http://192.168.1.9/android_login_api/search_species_map.php?species_name=" 
+ search_species;
    pDialog.setMessage("Loading data...");
    pDialog.show();

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String s) {
            try {
                JSONObject jsonObject = new JSONObject(s);
                JSONArray array = jsonObject.getJSONArray("tem");
                for(int i = 0; i<array.length(); i++) {
                    JSONObject o = array.getJSONObject(i);
                    species_id = o.getString("localname");
                    common = o.getString("name");
                    scientific = o.getString("scientificname");
                    local = o.getString("localname");
                    ArrayList<HashMap<String, String>> location = null;
                    String url = "http://192.168.1.9/android_login_api/search_location_map.php?speciesid=" + species_id;
                    try {

                        JSONArray data = new JSONArray(getHttpGet(url));

                        location = new ArrayList<HashMap<String, String>>();
                        HashMap<String, String> map;

                        for(i = 0; i < data.length(); i++){
                            JSONObject c = data.getJSONObject(i);

                            map = new HashMap<String, String>();
                            map.put("locationid", c.getString("locationid"));
                            map.put("brgy", c.getString("brgy"));
                            map.put("town", c.getString("town"));
                            map.put("latitude", c.getString("latitude"));
                            map.put("longitude", c.getString("longitude"));
                            map.put("speciesid", local);
                            map.put("flowercolor", c.getString("flowercolor"));
                            location.add(map);
                        }

                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                    }

这是我的getHttpGet:

 public static String getHttpGet(String url) {
    StringBuilder str = new StringBuilder();
    HttpClient client = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(url);
    try {
        HttpResponse response = client.execute(httpGet);
        StatusLine statusLine = response.getStatusLine();
        int statusCode = statusLine.getStatusCode();
        if (statusCode == 200) { // Download OK
            HttpEntity entity = response.getEntity();
            InputStream content = entity.getContent();
            BufferedReader reader = new BufferedReader(new 
InputStreamReader(content));
            String line;
            while ((line = reader.readLine()) != null) {
                str.append(line);
            }
        } else {
            Log.e("Log", "Failed to download result..");
        }
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return str.toString();
}

这是PHP文件:

<?php
include 'dbconfig.php';

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
} 
$species_name = $_GET['species_name'];
$sql = "SELECT * from tbl_species WHERE CONCAT_WS(name, localname, 
scientificname, familyname, flowercolor, leafshape) LIKE '%$species_name%'";
$result = $conn->query($sql);

if ($result->num_rows >0) {
$arr['aaData'] = array(); 
// output data of each row
while($row[] = $result->fetch_assoc()) {

    $tem = $row;

   $json = json_encode(array('tem' => $tem));
}

} else {
echo "0 results";
}
echo $json;
$conn->close();
?>

具体来说,我的for循环只能得到第一个物种,在得到之后,for循环停止以获得其他物种。我不知道什么是错的,我应该改变什么。我正在创建一个项目,可以按名称,颜色,形状等搜索物种。

3 个答案:

答案 0 :(得分:0)

只是一个猜测,但也许是因为你在两个for循环中使用相同的int

for(int i = 0; i<array.length(); i++)

for(i = 0; i < data.length(); i++){

答案 1 :(得分:0)

您有NetworkOnMainThreadException,当您处理第二个网址时,您的应用会崩溃。

你可以告诉我们坠机事件。

您应该在线程或asynctask中执行所有网络/互联网代码。

答案 2 :(得分:0)

你必须有2个变量来保存PHP文件中的值。并使用array_push来保存数组中的所有值

    search_species = txtSearchMap.getText().toString();
        String url = 
    "http://192.168.1.9/android_login_api/search_species_map.php?type=first&species_name=" 
    + search_species;
.
.
.
 local = o.getString("localname");
                    ArrayList<HashMap<String, String>> location = null;
                    String url = "http://192.168.1.9/android_login_api/search_location_map.php?type=tow&speciesid=" + species_id;
                    try {.....

并在PHP文件中

$type = $_GET['type'];
$response1 = array();
$response2 = array();

.
.
.
while($row[] = $result->fetch_assoc()) {


if (type ==="fist"){
        array_push($response2,array('locationid' => $row['locationid'],'brgy'=>$row['brgy'],'town'=>$row['town'],'latitude'=>$row['latitude'],'flowercolor'=>$row['flowercolor']));
}elseif (type ==="tow"){
 array_push($response2,array('locationid' => $row['locationid'],'brgy'=>$row['brgy'],'town'=>$row['town'],'latitude'=>$row['latitude'],'flowercolor'=>$row['flowercolor']));
}
}////end while

if (type ==="fist"){
echo $response1;
}elseif(type1 ==="tow"){
echo $response2;
}
.
.
.