如何解决org.json.JSONException:Android中的responsetypes没有值?

时间:2017-08-07 13:10:54

标签: android

我正在开发,我想要显示用户注册。以下是我的代码,它在Logcat中显示正确的响应,但没有在app端显示消息(即注册成功或注册失败消息)。我正在尝试解析响应,但 logcat 显示消息是&# 34; org.json.JSONException:没有响应类型的值" 我如何在此解析json数据?请建议我!! 我按照建议做了改变!
我还有什么需要做的?

//以下是来自Logcat

内的服务器显示的响应
{"signup":[
            {"sessionid":0,
            "responsetype":"failure",
            "message"‌​:"Username emailid already register."
            }
         ]
}

    // Following is my code

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText editTextfName;
    private EditText editTextlName, editTextDid, editTextBd;
    private EditText editTextPassword;
    private EditText editTextEmail;
    TextView txtBirthDate;

    private Button buttonRegister;
    Button buttonBdate;

    String selected_date="";
    int mYear, mMonth, mDay;
    Calendar myCalendar;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        editTextfName = (EditText) findViewById(R.id.editTextfName);
        editTextlName = (EditText) findViewById(R.id.editTextlName);
        //  editTextDid = (EditText) findViewById(R.id.editTextdid);
        editTextBd = (EditText) findViewById(R.id.editTextbdate);
        //   txtBirthDate = (TextView) findViewById(R.id.txtBdate);
        editTextPassword = (EditText) findViewById(R.id.editTextPassword);
        editTextEmail = (EditText) findViewById(R.id.editTextEmail);

        buttonRegister = (Button) findViewById(R.id.buttonRegister);

        buttonRegister.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {

        if(v.getId() == R.id.buttonRegister){

            // Get the values given in EditText fields
            String firstname = editTextfName.getText().toString();
            String lastname = null;
            String emailaddress = editTextEmail.getText().toString();
            String birthdate = null;
            String password = editTextPassword.getText().toString();
            String deviceid = null;

            System.out.println("Givennames is :" + firstname + " Given password is :" + password);

            // Pass those values to connectWithHttpGet() method
            connectWithHttpGet(firstname,lastname,emailaddress,birthdate,password,deviceid);
        }
    }

    private void connectWithHttpGet(String firstname, String lastname, String emailaddress, String birthdate, String password, String deviceid) {

// Connect with a server is a time consuming process.
//Therefore we use AsyncTask to handle it
// From the three generic types;
//First type relate with the argument send in execute()
//Second type relate with onProgressUpdate method which I haven't use in this code
//Third type relate with the return type of the doInBackground method, which also the input type of the onPostExecute method
        class HttpGetAsyncTask extends AsyncTask<String, Void, String> {

            private Context context;

            private HttpGetAsyncTask(Context context){
                this.context=context;
            }


            @Override
            protected String doInBackground(String... params) {

                // As you can see, doInBackground has taken an Array of Strings as the argument
                //We need to specifically get the givenUsername and givenPassword

                String paramFname = params[0];
                String paramLname = params[1];
                String paramEmail = params[2];
                String paramBirthdate = params[3];
                String paramPassword = params[4];
                String paramDeviceid = params[5];
                System.out.println("userID" + paramFname + " password is :" + paramPassword);

                // Create an intermediate to connect with the Internet
                HttpClient httpClient = new DefaultHttpClient();

                // Sending a GET request to the web page that we want
                // Because of we are sending a GET request, we have to pass the values through the URL
                HttpGet httpGet = new HttpGet("http://www.example.com/ypAndroid/api/signUp?firstname="+paramFname+"&lastname="+paramLname+"&emailid="+paramEmail+"&birthdate="+paramBirthdate+"&password="+paramPassword+"&deviceid="+null);

                try {
                    // execute(); executes a request using the default context.
                    // Then we assign the execution result to HttpResponse
                    HttpResponse httpResponse = httpClient.execute(httpGet);
                    System.out.println("httpResponse// getEntity() ; obtains the message entity of this response");
                    // getContent() ; creates a new InputStream object of the entity.
                    // Now we need a readable source to read the byte stream that comes as the httpResponse
                    InputStream inputStream = httpResponse.getEntity().getContent();

                    // We have a byte stream. Next step is to convert it to a Character stream
                    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

                    // Then we have to wraps the existing reader (InputStreamReader) and buffer the input
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                    // InputStreamReader contains a buffer of bytes read from the source stream and converts these into characters as needed.
                    //The buffer size is 8K
                    //Therefore we need a mechanism to append the separately coming chunks in to one String element
                    // We have to use a class that can handle modifiable sequence of characters for use in creating String
                    StringBuilder stringBuilder = new StringBuilder();

                    String bufferedStrChunk = null;

                    // There may be so many buffered chunks. We have to go through each and every chunk of characters
                    //and assign a each chunk to bufferedStrChunk String variable
                    //and append that value one by one to the stringBuilder
                    while((bufferedStrChunk = bufferedReader.readLine()) != null){
                        stringBuilder.append(bufferedStrChunk);
                    }

                    // Now we have the whole response as a String value.
                    //We return that value then the onPostExecute() can handle the content
                    System.out.println("Returninge of doInBackground :" + stringBuilder.toString());

                    // If the Username and Password match, it will return "working" as response
                    // If the Username or Password wrong, it will return "invalid" as response
                    return stringBuilder.toString();

                } catch (ClientProtocolException cpe) {
                    System.out.println("Exceptionrates caz of httpResponse :" + cpe);
                    cpe.printStackTrace();
                } catch (IOException ioe) {
                    System.out.println("Secondption generates caz of httpResponse :" + ioe);
                    ioe.printStackTrace();
                }

                return null;
            }

            // Argument comes for this method according to the return type of the doInBackground() and
            //it is the third generic type of the AsyncTask
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);

                System.out.println("Post result :" + result);
                try {
                    JSONObject jsonObject = new JSONObject(result);
                    JSONArray login = jsonObject.getJSONArray("signup");

                    JSONObject jsonObject1 = login.getJSONObject(0);
                    String sessionid = jsonObject1.getString("sessionid");
                    String responsetype = jsonObject1.getString("responsetype");
                    String message = jsonObject1.getString("message");

                    Log.i("response",responsetype);

                  //  Toast.makeText(RegisterActivity.this, responsetype, Toast.LENGTH_LONG).show();


                    if (TextUtils.equals(responsetype, "success")) {
                        Toast.makeText(RegisterActivity.this, "success !!" , Toast.LENGTH_LONG).show();
                    } else if (TextUtils.equals(responsetype, "failure")) {
                        Toast.makeText(RegisterActivity.this, "failed......!!", Toast.LENGTH_LONG).show();
                    }else  {
                        Toast.makeText(RegisterActivity.this, "Invalid...", Toast.LENGTH_LONG).show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

               }
        }

        // Initialize the AsyncTask class
        HttpGetAsyncTask httpGetAsyncTask = new HttpGetAsyncTask(RegisterActivity.this);
// Parameter we pass in the execute() method is relate to the first generic type of the AsyncTask
// We are passing the connectWithHttpGet() method arguments to that
        httpGetAsyncTask.execute(firstname,lastname,emailaddress,birthdate,password,deviceid);
    }
}

2 个答案:

答案 0 :(得分:1)

您的json有一个名为value_theme.setText(R.string.editor_div_value + "" + settings_theme);

的密钥

而您在代码中使用responsetype

responsetypes

删除“s”,它应该可以工作。

String responsetypes = jsonObject1.getString("responsetypes");

还使用以下参数和构造函数更新您的HttpGetAsyncTask类。因此,在HttpGetAsyncTask中添加以下代码

String responsetypes = jsonObject1.getString("responsetype");

然后初始化此调用使用代码如下 -

private Context context;
//in constructor:
public HttpGetAsyncTask(Context context){
        this.context=context;
}

而不是 -

HttpGetAsyncTask httpGetAsyncTask = new HttpGetAsyncTask(RegisterActivity.this);

并显示吐司使用 -

HttpGetAsyncTask httpGetAsyncTask = new HttpGetAsyncTask();

这是因为AsyncTask不继承上下文,因此无法使用AsyncTask中的if (TextUtils.equals(responsetypes, "success")) { Toast.makeText(context, "HTTP GET is working...", Toast.LENGTH_LONG).show(); } else { Toast.makeText(context, "Invalid...", Toast.LENGTH_LONG).show(); } 调用UI元素

答案 1 :(得分:0)

在响应类型中添加“s”,因为在你的json中

{"signup":[
        {"sessionid":0,
        "responsetype":"failure",
        "message"‌​:"Username emailid already register."
        }
    ]
}