试图连接到本地服务器时出现JSON异常


JSON Exception when attempting to connect to Local server

当我在本地服务器上注册其他用户时,我得到以下错误:

08-18 14:53:28.510: W/System.err(1223):     org.json.JSONException: No value for success
08-18 14:53:28.560: W/System.err(1223):     at org.json.JSONObject.get(JSONObject.java:355)
08-18 14:53:28.590: W/System.err(1223):     at org.json.JSONObject.getString(JSONObject.java:515)
08-18 14:53:28.590: W/System.err(1223):     at com.example.skelotong.RegularUsercreation$ruc.doInBackground(RegularUsercreation.java:134)
08-18 14:53:28.600: W/System.err(1223):     at com.example.skelotong.RegularUsercreation$ruc.doInBackground(RegularUsercreation.java:1)
08-18 14:53:28.600: W/System.err(1223):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-18 14:53:28.630: W/System.err(1223):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-18 14:53:28.630: W/System.err(1223):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-18 14:53:28.640: W/System.err(1223):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-18 14:53:28.640: W/System.err(1223):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-18 14:53:28.650: W/System.err(1223):     at java.lang.Thread.run(Thread.java:841)

我不知道怎么了。下面是我的java代码来注册用户:

@SuppressLint("NewApi")
private class ruc extends AsyncTask<String, Integer, Boolean> {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();
    final ProgressDialog pd = new ProgressDialog(RegularUsercreation.this);
    @SuppressLint("NewApi")
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pd.setMessage("Please wait");
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pd.setCanceledOnTouchOutside(false);
        pd.setCancelable(false);
        pd.setIndeterminate(true);
        pd.show();
        System.out.println("1");
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
                System.out.println(TAG_SUCCESS);
        }
    @Override
    protected Boolean doInBackground(String... params) {
        System.out.println(2);
        // Importing all assets like buttons, text fields
        inputFullName = (EditText) findViewById(R.id.FullName2);
        inputEmail = (EditText) findViewById(R.id.Email2);
        inputPassword = (EditText) findViewById(R.id.Password2);
        inputUsername = (EditText) findViewById(R.id.Username2);
        dateofbirth = (EditText) findViewById(R.id.DOB2);
        zip = (EditText) findViewById(R.id.ZipCode2);
        btnRegister = (Button) findViewById(R.id.create2);
        btnLinkToLogin = (Button) findViewById(R.id.cancel2);
        registerErrorMsg = (TextView) findViewById(R.id.errormessage3);
        // skils = (EditText) findViewById(R.id.skills1);
        System.out.println("3");
        // Register Button Click event
        String name = inputFullName.getText().toString();
        String email = inputEmail.getText().toString();
        String password = inputPassword.getText().toString();
        String usernmae = inputUsername.getText().toString();
        String birth = dateofbirth.getText().toString();
        String zipcode = zip.getText().toString();
        // String skills = skils.getText().toString();
        System.out.println(name + email + password + usernmae + birth
                + zipcode + 4 +TAG_SUCCESS);
        // check for login response
        // check for login response
        try {
            UserFunction userFunction = new UserFunction();
            JSONObject json = userFunction.registerUser(name, email,
                    password, usernmae, birth, zipcode,TAG_SUCCESS);
            //System.out.println(json.get(TAG_SUCCESS));
            if (json.optString(TAG_SUCCESS) != null) {
                String res = json.getString("success");
                System.out.println(91);
                System.out.println(res);
                if (Integer.parseInt(res) == 1) {
                    publishProgress(1);
                    // user successfully registred
                    // Store user details in SQLite Database
                    DatabaseHandler db = new DatabaseHandler(
                            getApplicationContext());
                    JSONObject json_user = json.getJSONObject("user");
                    System.out.println(6);
                    // Clear all previous data in database
                    userFunction.logoutUser(getApplicationContext());
                    db.addUser(json_user.getString(KEY_NAME),
                            json_user.getString(KEY_EMAIL),
                            json.getString(KEY_UID),
                            json_user.getString(KEY_CREATED_AT),
                            json_user.getString(KEY_USERNAME),
                            json_user.getString(KEY_password),
                            json_user.getString(KEY_ZIP),
                            json_user.getString(TAG_SUCCESS));
                    System.out.println("7");
                    return true;
                } else {
                    System.out.println("ERROR");
                    // Error in registration
                    registerErrorMsg
                            .setText("Error occured in registration");
                    return false;
                }
            } else {
                System.out.println(TAG_SUCCESS);
                return false;
            }
        } catch (JSONException e) {
            publishProgress(1);
            e.printStackTrace();
            System.out.println("9");
            System.out.println(e.toString());
            System.out.println(e.getCause());
            return false;
        } catch (RuntimeException e) {
            System.out.println("92");
            System.out.println(e.toString());
            System.out.println(e.getCause());
            return false;
        } catch (Exception e) {
            System.out.println("93");
            System.out.println(e.toString());
            System.out.println(e.getCause());
        }
        return false;
    }
    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
        super.onProgressUpdate(values);
        if (values.equals(1)) {
            pd.setMessage("Almost Done");
        }
    }
下面是JSON的代码:
static BufferedReader is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() throws JSONException {
}
public  void JSONObject(java.lang.String source) {
}
public JSONObject getJSONFromUrl(String url, List<NameValuePair> param) {
    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("http://10.0.2.2/db_android/");
        HttpResponse httpResponse = httpClient.execute(httpPost);
        BufferedReader in = new BufferedReader(new InputStreamReader(
                httpResponse.getEntity().getContent(),"iso-8859-1"),8);
        is = in;
        System.out.println(json);
        /**
         * DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost
         * httpPost = new HttpPost(url);
         * 
         * HttpResponse httpResponse = httpClient.execute(httpPost);
         * HttpEntity httpEntity = httpResponse.getEntity(); is =
         * httpEntity.getContent();
         * 
         */
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("http://10.0.2.2/db_android/");
        HttpResponse httpResponse = httpClient.execute(httpPost);
        System.out.println(22);
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                httpResponse.getEntity().getContent(),"iso-8859-1"),8);
        System.out.println(22);
        StringBuilder sb = new StringBuilder();
        String line = null;
        System.out.println(33);
        while ((line = reader.readLine()) != null) {
            sb.append(line);
            System.out.println(44);
        }
        is.close();
        System.out.println(55);
        json = sb.toString();
        System.out.println(66);
        System.out.println(json);
        System.out.println(69);
        System.out.println(sb.toString());
        System.out.println(67);
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }
    // try parse the string to a JSON object
    try {
        System.out.println(77);
        StringBuilder sb = new StringBuilder();
        json = sb.toString();
        Log.e("adsf", json.toString());
        Log.e("ads", json);
        System.out.println(79);
        jObj = new JSONObject("{"+json+"}");
        System.out.println(88);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
        e.getCause();
    }
    // return JSON String
    return jObj;
}

}

下面是我的另一段php代码:

} else if ($tag == 'register') {
    // Request type is Register new user
    $response ["success"] = 1;
    $response ["uid"] = $user ["unique_id"];
    $response ["user"] ["name"] = $user ["name"];
    $response ["user"] ["username"] = $user ["username"];
    $response ["user"] ["email"] = $user ["email"];
    $response ["user"] ["zipcode"] = $user ["zipcode"];
    $response ["user"] ["password"] = $user ["password"];
    $response ["user"] ["created_at"] = $user ["created_at"];
    $response ["user"] ["updated_at"] = $user ["updated_at"];
    $response ["user"] ["skills"] = $user ["skills"];
    // check if user is already existed
    if ($db->isUserExisted ( $email )) {
        // user is already existed - error response
        $response ["error"] = 2;
        $response ["error_msg"] = "User already existed";
        echo json_encode ( $response );
    } else if (! $db->validEmail ( $email )) {
        $response ["error"] = 3;
        $response ["error_msg"] = "Invalid Email Id";
        echo json_encode ( $response );
    } else {
        // store user
        $user = $db->storeUser ( $name, $email, $password, $unique_id, $dateofbirth, $zipcode, $skills, $username, $updated_at, $created_at );
        if ($user) {
            // user stored successfully
            $response ["uid"] = $user ["unique_id"];
            $response ["user"] ["name"] = $user ["name"];
            $response ["user"] ["username"] = $user ["username"];
            $response ["user"] ["email"] = $user ["email"];
            $response ["user"] ["zipcode"] = $user ["zipcode"];
            $response ["user"] ["password"] = $user ["password"];
            $response ["user"] ["created_at"] = $user ["created_at"];
            $response ["user"] ["updated_at"] = $user ["updated_at"];
            $response ["user"] ["skills"] = $user ["skills"];
            $response ["user"] ["uid"] = $user ["unique_id"];
            mail ( $email, $subject, $message, $headers );
            echo json_encode ( $response );
        } else {
            // user failed to store
            $response ["error"] = 1;
            $response ["error_msg"] = "JSON Error occured in Registartion";
            echo json_encode ( $response );
        }
    }
}

最后是我的一个数据函数:

public function storeUser($name, $email, $username, $password, $zipcode, $skills) {
    $uuid = uniqid('', true);
    $hash = $this->hashSSHA($password);
    $encrypted_password = $hash["encrypted"]; // encrypted password
    $salt = $hash["salt"]; // salt
    $result = mysql_query("INSERT INTO users(unique_id, name, email, username,   
 encrypted_password, salt, created_at) VALUES('$uuid', '$name', '$email',     '      
 $username','$zipcode', '$skills' '$encrypted_password', '$salt', NOW())");
    // check for successful store
    if ($result) {
        // get user details
        $uid = mysql_insert_id(); // last inserted id
        $result = mysql_query("SELECT * FROM users WHERE uid = $uid");
        // return user details
        return mysql_fetch_array($result);
    } else {
        return false;
    }
}

我很抱歉在这篇文章中列出的所有代码。我不知道错误有多深,但我知道它在这些代码行之间。

String res = json.getString("success");
                System.out.println(91);
                System.out.println(res);
if (Integer.parseInt(res) == 1) {     //Line 134 of regular user creation as said in   
log cat

请尽一切可能帮助我。

表示成功键不存在。

每次你设置一个错误,你应该设置success为false:

 $response ["success"] = 0;

JSON支持布尔值(truefalse),您应该使用它,它将使解析更容易。

Boolean res = json.getBoolean("success");
if(res){
  //success
}

你不需要映射用户的每个属性,你可以通过直接存储用户对象来构建多维数组。

另外,你应该在最后只回显一次JSON,这将避免在满足多个条件时无效的JSON。

你应该有以下几行:

$response = array();
...
}else if ($tag == 'register') {
    // check if user is already existed
    if ($db->isUserExisted ( $email )) {
        $response ["success"] = false;
        $response ["error_msg"] = "User already existed";
        echo json_encode ( $response );
    } else if (! $db->validEmail ( $email )) {
        $response ["success"] = false;
        $response ["error_msg"] = "Invalid Email Id";
        echo json_encode ( $response );
    } else {
        // store user
        $user = $db->storeUser ( $name, $email, $password, $unique_id, $dateofbirth, $zipcode, $skills, $username, $updated_at, $created_at );
        if ($user) {
            // user stored successfully
            // Request type is Register new user
            $response ["success"] = true;
            $response ["user_data"] = $user;
            mail ( $email, $subject, $message, $headers );
            echo json_encode ( $response );
        } else {
            $response ["success"] = false;
            $response ["error_msg"] = "JSON Error occured in Registartion";
        }
    }
}
echo json_encode ( $response );