1

LogCat で次のエラーが発生します。

Error parsing data org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONArray

以下は、お見せできるすべてのファイルです。問題とその解決策を至急教えてください。私が推測することは次のとおりです。1.おそらく問題は、JSON配列のデータの解析にあります。2. 問題は私の php API にあるのかもしれません。json_encode を適切にエンコードしていないと思います。

以下のように

[{"uid":"120","name":"MyFirstName MyLastName"}]

また、1. Raw JSON と 2. Intented Json の両方の形式の動作に多少の違いがあることもお知らせください。

以下は意図したjson形式です

[
    {
    "uid":"120",
    "name":"MyFirstName MyLastName"
    }
]

ここに JSONUseActivity.java があります

package com.example.oncemore;
import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;

import com.example.oncemore.CustomHttpClient;

import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class JSONUseActivity extends Activity {

EditText email,password; 
Button submit;
TextView tv; // TextView to show the result of MySQL query
String returnString; // to store the result of MySQL query after decoding
// JSON
/** Called when the activity is first created. */
@Override

public void onCreate(Bundle savedInstanceState) {
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads().detectDiskWrites().detectNetwork() // StrictMode is
            // most commonly
            // used to catch
            // accidental
            // disk or
            // network
            // access on the
            // application's
            // main thread
            .penaltyLog().build());
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_jsonuse);

    email = (EditText) findViewById(R.id.email);
    password = (EditText) findViewById(R.id.password);
    submit = (Button) findViewById(R.id.submitbutton);
    tv = (TextView) findViewById(R.id.showresult);

    // define the action when user clicks on submit button
    submit.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // declare parameters that are passed to PHP script i.e. the
            ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
            // define the parameter
            postParameters.add(new BasicNameValuePair("email",email.getText().toString()));
            postParameters.add(new BasicNameValuePair("password",password.getText().toString()));
            String response = null;
            // call executeHttpPost method passing necessary parameters
            try {
                response = CustomHttpClient.executeHttpPost(
                        "http://mywebsite.com/android/api.php",
                        postParameters);
                // store the result returned by PHP script that runs MySQL
                // query
                String result = response.toString();
                // parse json data
                try {
                    returnString = "";
    //I think the line below is creating some problem 
                    JSONArray jArray = new JSONArray(result);
                    for (int i = 0; i < jArray.length(); i++) {
                        JSONObject json_data = jArray.getJSONObject(i);
                        Log.i("log_tag",
                        "id: " + json_data.getInt("uid")+", name: " + json_data.getString("name"));
                        // Get an output to the screen
                        returnString += "\n" + json_data.getString("name")
                                + " -> " + json_data.getInt("uid");
                    }
                }catch (JSONException e) {
                    Log.e("log_tag", "Error parsing data " + e.toString());
                }
                try {
                    tv.setText(returnString);
                }
                catch (Exception e) {
                    Log.e("log_tag", "Error in Display!" + e.toString());
                    ;
                }
            }
            catch (Exception e) {
                Log.e("log_tag",
                        "Error in http connection!!" + e.toString());
            }
        }
    });
}

}

ここに CustomHttpClient.java があります

package com.example.oncemore;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import android.util.Log;

public class CustomHttpClient {
 /** The time it takes for our client to timeout */
 public static final int HTTP_TIMEOUT = 30 * 1000; // milliseconds
 /** Single instance of our HttpClient */
 private static HttpClient mHttpClient;
 /**
  * Get our single instance of our HttpClient object.
  * 
  * @return an HttpClient object with connection parameters set
  */
 private static HttpClient getHttpClient() {
  if (mHttpClient == null) {
   mHttpClient = new DefaultHttpClient();
   final HttpParams params = mHttpClient.getParams();
   HttpConnectionParams.setConnectionTimeout(params, HTTP_TIMEOUT);
   HttpConnectionParams.setSoTimeout(params, HTTP_TIMEOUT);
   ConnManagerParams.setTimeout(params, HTTP_TIMEOUT);
  }
  return mHttpClient;
 }
 /**
  * Performs an HTTP Post request to the specified url with the specified
  * parameters.
  * 
  * @param url
  *            The web address to post the request to
  * @param postParameters
  *            The parameters to send via the request
  * @return The result of the request
  * @throws Exception
  */
 public static String executeHttpPost(String url, ArrayList<NameValuePair> postParameters) throws Exception {
  BufferedReader in = null;
  try {
   HttpClient client = getHttpClient();
   HttpPost request = new HttpPost(url);
   UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
   request.setEntity(formEntity);
   HttpResponse response = client.execute(request);
   in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
   StringBuffer sb = new StringBuffer("");
   String line = "";
   String NL = System.getProperty("line.separator");
   while ((line = in.readLine()) != null) {
    sb.append(line + NL);
   }
   in.close();
   String result = sb.toString();
   return result;
  } finally {
   if (in != null) {
    try {
     in.close();
    } catch (IOException e) {
     Log.e("log_tag", "Error converting result "+e.toString()); 
     e.printStackTrace();
    }
   }
  }
 }
 /**
  * Performs an HTTP GET request to the specified url.
  * 
  * @param url
  *            The web address to post the request to
  * @return The result of the request
  * @throws Exception
  */
 public static String executeHttpGet(String url) throws Exception {
  BufferedReader in = null;
  try {
   HttpClient client = getHttpClient();
   HttpGet request = new HttpGet();
   request.setURI(new URI(url));
   HttpResponse response = client.execute(request);
   in = new BufferedReader(new InputStreamReader(response.getEntity()
     .getContent()));
   StringBuffer sb = new StringBuffer("");
   String line = "";
   String NL = System.getProperty("line.separator");
   while ((line = in.readLine()) != null) {
    sb.append(line + NL);
   }
   in.close();
   String result = sb.toString();
   return result;
  } finally {
   if (in != null) {
    try {
     in.close();
    } catch (IOException e) {
     Log.e("log_tag", "Error converting result "+e.toString()); 
     e.printStackTrace();
    }
   }
  }
 }
}

ここにapi.phpがあります

<?php
require_once("../contactdb.php");
$myusername=$_REQUEST["email"]; 
$mypassword=$_REQUEST["password"]; 
// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT uid,name FROM u_info WHERE email='".$myusername."' AND password ='".$mypassword."'";
$result=mysql_query($sql);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
if($count==1){
    while($row=mysql_fetch_assoc($result))
    $output[]=$row;
    echo json_encode($output);
    mysql_close();
}else{
    echo "Error Occured!";
}
?>

最後に、ブラウザに行ってこのように書くと

http://mywebsite.com/android/api.php?email=myname@yahoo.com&password=1234

このjson配列を取得しました!

[{"uid":"120","name":"MyFirstName MyLastName"}]

これまでグーグルで調べたところ、さまざまな形式のjson配列が見つかりました! 私はどこでも意図した Json を見つけました。私のjson配列は現在Raw Json形式です。Raw Json 形式を Intented Json 形式に変換する方法がどこにも見つかりません。

よろしくお願いします!どんな助けでも大歓迎です!できれば正しいコードを教えてください!

4

1 に答える 1

1

これは有効な JSON 構文ではありません:

{
    "employees": [
        { "firstName":"John" , "lastName":"Doe" },
        { "firstName":"Anna" , "lastName":"Smith" },
        { "firstName":"Peter" , "lastName":"Jones" }
    ]
}

有効です。

注: これも有効です。

{"employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] }

インデントに関するフォーマットではなく、構文構造が重要な部分です。

別の言い方をすれば、返される形式を使用するには、応答から部分文字列を切り取る必要があります。つまり、中括弧を囲む角括弧を取り除く必要があります。

PHP では、次のように適切な json 応答を作成します。

// array for JSON response
$response = array();
$response["apps"] = array();

$apps = array();

$apps["name"] = $row["name"];
$apps["package"] = $row["package"];
$apps["version"] = $row["version"];
$apps["dateversion"] = $row["dateversion"];

array_push($response["apps"], $apps);

$response["success"] = 1;

echo json_encode($response);

これは基本的に

{ "success":"1", "apps":{["name":"NAME", "package":"PACKAGE", "version":"VERSION", "dateversion":"DATEVERSION"]}}

これは、利用できる JSON クラスの豊富な例のいずれかによって正しく解析できます。最初のN文字を手動で削除するために部分文字列をハッキングして使用することは、良い習慣ではありません...

于 2013-08-09T14:12:58.017 に答える