0

機能: これは、私のチームが作成しているサイト apdata.info を模倣する Android アプリです。これは 2 番目のページです。リクエストした検索に一致するエアポップが表示されます。

PHP

...

$sql = "SELECT apname,apcity,apstate,apcountry,IATA FROM airports WHERE MATCH(apname,apcity,apstate,apcountry,IATA) AGAINST (? IN BOOLEAN MODE)";
$link = connectToDB();
if($stmt = $link->prepare($sql))
{
    $stmt->bind_param('s', $search);

    if($stmt->execute())
    {
        $stmt->store_result();
        if($stmt->num_rows >= 1)
        {
            $resultSet = array();

            $stmt->bind_result($apname, $apcity, $apstate, $apcountry, $IATA);
            $search_rows = $stmt->num_rows;
            if($search_rows > 0){
            while($stmt->fetch())
            {
                $resultSet[] = array('apname' => $apname, 'apcity' => $apcity, 'apstate' => $apstate, 'apcountry' => $apcountry, 'IATA' => $IATA);
                //echo "Your search returned $search_rows results";
                //echo "<a href='/Airports/airport.php?IATA=".$IATA."'>".$apname."</a><br>";
    print(json_encode($resultSet));
...

ジャワ:

private void fetchResults(String searchfor){
            String result = "";
            //the year data to send
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("search", searchfor));


            //http post
            try{
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://apdata.info/results/androidresult.php");
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                entity = response.getEntity();
                is = entity.getContent();
                //System.out.println("------------looks good here");
            }catch(Exception e){
                Log.e("log_tag", "Error in http connection "+e.toString());
            }
            //convert response to string
            try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                }
                is.close();

                result=sb.toString();
                //System.out.println(result);
            }catch(Exception e){
                Log.e("log_tag", "Error converting result "+e.toString());
            }

            System.out.println(result);
            //parse json data
            try{
                JSONArray jArray = new JSONArray(result);
                System.out.println();
                results = new ApResult[jArray.length()];
                for(int i=0;i<jArray.length();i++){
                    System.out.println("-----------jArray.length");
                        JSONObject json_data = jArray.getJSONObject(i);
                        results[i] = new ApResult(
                                json_data.getString("IATA"),
                                json_data.getString("apname"),
                                json_data.getString("apcity"),
                                json_data.getString("apstate"),
                                json_data.getString("apcountry")
                        );
                }
            }catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());
            }
        }

Result 結果文字列を出力した結果:

03-13 07:40:06.985: I/System.out(220):  [{"apname":"Bismarck Municipal Airport","apcity":"Bismarck","apstate":"North Dakota","apcountry":"United States","IATA":"BIS"}][{"apname":"Bismarck Municipal 
Airport","apcity":"Bismarck","apstate":"North Dakota","apcountry":"United States","IATA":"BIS"},{"apname":"Hector International Airport","apcity":"Fargo","apstate":"North Dakota","apcountry":"United 
States","IATA":"FAR"}][{"apname":"Bismarck Municipal Airport","apcity":"Bismarck","apstate":"North Dakota","apcountry":"United States","IATA":"BIS"},{"apname":"Hector International 
Airport","apcity":"Fargo","apstate":"North Dakota","apcountry":"United States","IATA":"FAR"},{"apname":"Cologne Bonn Airport","apcity":"Cologne \/ Bonn","apstate":"North Rhine-Westphalia","apcountry":"Germany","IATA":"CGN"}][{"apname":"Bismarck Municipal Airport","apcity":"Bismarck","apstate":"North 
Dakota","apcountry":"United States","IATA":"BIS"},{"apname":"Hector International Airport","apcity":"Fargo","apstate":"North Dakota","apcountry":"United States","IATA":"FAR"},{"apname":"Cologne Bonn Airport","apcity":"Cologne \/ Bonn","apstate":"North Rhine-Westphalia","apcountry":"Germany","IATA":"CGN"},
{"apname":"Dusseldorf International Airport","apcity":"Dusseldorf","apstate":"North Rhine-Westphalia","apcountry":"Germany","IATA":"DUS"}]

問題は、jArray.length が 1 に等しいということです。私の出力からわかるように、文字列は 2 つのセクションに分かれているようです。最初は [{"apname":"Bismarck Municipal Airport","apcity":"Bismarck","apstate":"North Dakota" です。 ,"apcountry":"United States","IATA":"BIS"}] 他のすべてはカンマで区切られています。

この問題を修正するために、このバグを修正する機能を追加しました。

private String fixBug(String result) {
        result = result.replace("][", ",");
            return result;
        }

しかし、そもそもなぜそれが起こったのか知りたいです。

4

1 に答える 1

1

結果ごとに個別のjsonを作成しないでください。すべての結果を1つのjsonに含める必要があります。データを変数に保存し、whileループの外側で、これを有効なjsonにエンコードできます。検証にはhttp://jsonlint.com/を使用してみてください。

今あなたは持っています

while() {
    $resultSet[] = array('apname' => $apname, 'apcity' => $apcity, 'apstate' => $apstate, 'apcountry' => $apcountry, 'IATA' => $IATA);
    print(json_encode($resultSet));
}

どちらにする必要があります

while() {
    $resultSet[] = array('apname' => $apname, 'apcity' => $apcity, 'apstate' => $apstate, 'apcountry' => $apcountry, 'IATA' => $IATA);
}
print(json_encode($resultSet));
于 2013-03-13T08:50:17.953 に答える