如何检查服务器响应是否为 json?
how to check if the server response is json or not?
当我尝试通过注册用户向数据库添加一些数据时,我的应用程序遇到了问题,问题是 php 脚本是否有任何错误或者它没有返回 json 我得到一个错误,activity 被迫停止,而如果 php 没有错误并正确返回 json,一切正常,所以我想检查一下服务器响应知道它是否有效,所以我可以避免错误,这是我的代码:
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class Register extends Activity {
Button back;
Button register;
EditText iname;
EditText iemail;
EditText ireEmail;
EditText ipassword;
EditText irePassword;
EditText iid;
EditText iphone;
EditText iaddress1;
EditText iaddress2;
// Progress Dialog
private ProgressDialog pDialog;
JSONParser jsonParser = new JSONParser();
// url to create new product
private static String url_register = "http://192.168.0.103/perfectdelivery/register.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
iname = (EditText) findViewById(R.id.editText1);
iemail = (EditText) findViewById(R.id.editText2);
ireEmail = (EditText) findViewById(R.id.editText3);
ipassword = (EditText) findViewById(R.id.editText4);
irePassword = (EditText) findViewById(R.id.editText5);
iid = (EditText) findViewById(R.id.editText6);
iphone = (EditText) findViewById(R.id.editText7);
iaddress1 = (EditText) findViewById(R.id.editText8);
iaddress2 = (EditText) findViewById(R.id.editText9);
back = (Button) findViewById(R.id.button1);
register = (Button) findViewById(R.id.button2);
back.setOnClickListener(myhandler1);
register.setOnClickListener(myhandler2);
}
View.OnClickListener myhandler1 = new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(Register.this, MainPage.class);
startActivity(intent);
}
};
View.OnClickListener myhandler2 = new View.OnClickListener() {
public void onClick(View v) {
new NewAccount().execute();
}
};
/**
* Background Async Task to Create new product
*/
class NewAccount extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Register.this);
pDialog.setMessage("Registering...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Creating product
*/
protected String doInBackground(String... args) {
String name = iname.getText().toString();
String email = iemail.getText().toString();
String reEmail = ireEmail.getText().toString();
String password = ipassword.getText().toString();
String rePassword = irePassword.getText().toString();
String id = iid.getText().toString();
String phone = iphone.getText().toString();
String address1 = iaddress1.getText().toString();
String address2 = iaddress2.getText().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name", name));
params.add(new BasicNameValuePair("email", email));
params.add(new BasicNameValuePair("password", password));
params.add(new BasicNameValuePair("id", id));
params.add(new BasicNameValuePair("phone", phone));
params.add(new BasicNameValuePair("address1", address1));
params.add(new BasicNameValuePair("address2", address2));
// getting JSON Object
// Note that create product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_register,
"POST", params);
if(json != null) {
// check log cat fro response
Log.d("Create Response", json.toString());
// check for success tag
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully created product
Intent i = new Intent(Register.this, MainPage.class);
startActivity(i);
// closing this screen
finish();
} else {
// failed to create product
}
} catch (JSONException e) {
e.printStackTrace();
}
}
else{
Toast.makeText(getApplicationContext(), "An error occurred, please try again", Toast.LENGTH_LONG).show();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* *
*/
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
}
}
}
根据之前的评论:假设服务器正确设置了响应的 Content-Type
header 字段,您可能会在尝试处理响应 body 之前检查它。
即如果返回json,则header的值应该是application/json
。如果返回错误(可能不是 json 格式,否则您的问题将是一个有争议的问题),它可能是 text/html
或 text/plain
之类的东西。到底是哪个并不重要,只要服务器响应包含 'success' 和 'error'.
的不同内容类型值即可
检查 Content-Type
header 看起来有点像这样:
HttpResponse response = ...
Header contentTypeHeader = response.getFirstHeader("Content-Type");
if ("application/json".equals(contentTypeHeader.getValue()) {
// server returned json
} else {
// server returned something else, potentially an error
}
由您来实施实际行为并处理 null
值等
当您在 onPostExecute() 中获得响应时,只需尝试通过在 JSONObject 的构造函数中传递该响应来将该字符串转换为 json 对象。看下面的代码
try {
JSONObject json = new JSONObject("your_output");
} catch (JSONException e) {
// your output is not in json format
e.printStackTrace();
}
因此,如果您的输出是 JSON 格式,则对象创建成功。否则它会抛出异常。
当我尝试通过注册用户向数据库添加一些数据时,我的应用程序遇到了问题,问题是 php 脚本是否有任何错误或者它没有返回 json 我得到一个错误,activity 被迫停止,而如果 php 没有错误并正确返回 json,一切正常,所以我想检查一下服务器响应知道它是否有效,所以我可以避免错误,这是我的代码:
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class Register extends Activity {
Button back;
Button register;
EditText iname;
EditText iemail;
EditText ireEmail;
EditText ipassword;
EditText irePassword;
EditText iid;
EditText iphone;
EditText iaddress1;
EditText iaddress2;
// Progress Dialog
private ProgressDialog pDialog;
JSONParser jsonParser = new JSONParser();
// url to create new product
private static String url_register = "http://192.168.0.103/perfectdelivery/register.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
iname = (EditText) findViewById(R.id.editText1);
iemail = (EditText) findViewById(R.id.editText2);
ireEmail = (EditText) findViewById(R.id.editText3);
ipassword = (EditText) findViewById(R.id.editText4);
irePassword = (EditText) findViewById(R.id.editText5);
iid = (EditText) findViewById(R.id.editText6);
iphone = (EditText) findViewById(R.id.editText7);
iaddress1 = (EditText) findViewById(R.id.editText8);
iaddress2 = (EditText) findViewById(R.id.editText9);
back = (Button) findViewById(R.id.button1);
register = (Button) findViewById(R.id.button2);
back.setOnClickListener(myhandler1);
register.setOnClickListener(myhandler2);
}
View.OnClickListener myhandler1 = new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(Register.this, MainPage.class);
startActivity(intent);
}
};
View.OnClickListener myhandler2 = new View.OnClickListener() {
public void onClick(View v) {
new NewAccount().execute();
}
};
/**
* Background Async Task to Create new product
*/
class NewAccount extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Register.this);
pDialog.setMessage("Registering...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Creating product
*/
protected String doInBackground(String... args) {
String name = iname.getText().toString();
String email = iemail.getText().toString();
String reEmail = ireEmail.getText().toString();
String password = ipassword.getText().toString();
String rePassword = irePassword.getText().toString();
String id = iid.getText().toString();
String phone = iphone.getText().toString();
String address1 = iaddress1.getText().toString();
String address2 = iaddress2.getText().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name", name));
params.add(new BasicNameValuePair("email", email));
params.add(new BasicNameValuePair("password", password));
params.add(new BasicNameValuePair("id", id));
params.add(new BasicNameValuePair("phone", phone));
params.add(new BasicNameValuePair("address1", address1));
params.add(new BasicNameValuePair("address2", address2));
// getting JSON Object
// Note that create product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_register,
"POST", params);
if(json != null) {
// check log cat fro response
Log.d("Create Response", json.toString());
// check for success tag
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully created product
Intent i = new Intent(Register.this, MainPage.class);
startActivity(i);
// closing this screen
finish();
} else {
// failed to create product
}
} catch (JSONException e) {
e.printStackTrace();
}
}
else{
Toast.makeText(getApplicationContext(), "An error occurred, please try again", Toast.LENGTH_LONG).show();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* *
*/
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
}
}
}
根据之前的评论:假设服务器正确设置了响应的 Content-Type
header 字段,您可能会在尝试处理响应 body 之前检查它。
即如果返回json,则header的值应该是application/json
。如果返回错误(可能不是 json 格式,否则您的问题将是一个有争议的问题),它可能是 text/html
或 text/plain
之类的东西。到底是哪个并不重要,只要服务器响应包含 'success' 和 'error'.
检查 Content-Type
header 看起来有点像这样:
HttpResponse response = ...
Header contentTypeHeader = response.getFirstHeader("Content-Type");
if ("application/json".equals(contentTypeHeader.getValue()) {
// server returned json
} else {
// server returned something else, potentially an error
}
由您来实施实际行为并处理 null
值等
当您在 onPostExecute() 中获得响应时,只需尝试通过在 JSONObject 的构造函数中传递该响应来将该字符串转换为 json 对象。看下面的代码
try {
JSONObject json = new JSONObject("your_output");
} catch (JSONException e) {
// your output is not in json format
e.printStackTrace();
}
因此,如果您的输出是 JSON 格式,则对象创建成功。否则它会抛出异常。