问题
I have JSON data like this:
[{"id":"1",
"client_name":"Glasco Smith Klin",
"campaign_name":"Health Medicine Survay",
"question":"MODE OF COMPLAINT CAN BE GIVEN THROUGH __________________",
"option_A":"WRITTEN",
"option_B":"ORAL",
"option_C":"PHONE CALL",
"option_D":"ALL OF THE ABOVE",
"q_prefix":"GSKHMSQ"},
{"id":"2",
"client_name":"Glasco Smith Klin",
"campaign_name":"Health Medicine Survay",
"question":"ADDING NEW FIR CAN BE DONE FROM WHICH ROLE",
"option_A":"IO",
"option_B":"TRAFFIC",
"option_C":"SHO-CRIME",
"option_D":"ADMINISTRATOR",
"q_prefix":"GSKHMJD"}]
I want to retrieve all q_prefix column into spinner. But in my spinner no data is displayed. When I run my app, I am getting an error: "Unable to start Activity" and Java.lang.NullPointerException at this line: jsonArray = jSon.getJSONArray(TAG_CODE);.
Here is my code:
public class SpinDemo extends Activity {
private static String strUrl = "http://192.168.1.61/jyoti/android_app/all_questions.php";
private static String TAG_ID = "id";
private static String TAG_CODE = "q_prefix";
JSONArray jsonArray = null;
Spinner codeSpinner, spinner2;
@SuppressWarnings("unused")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
codeSpinner = (Spinner) findViewById(R.id.spinner2);
ArrayList codeList = new ArrayList();
// creating instance of JSONPrser
JSONParser jParser = new JSONParser();
// getting JSON string from URL
JSONObject jSon = jParser.getJSONFromUrl(strUrl);
System.out.println("Hello ********************");
try {
// Getting Array of Code
jsonArray = jSon.getJSONArray(TAG_CODE);
final String[] items = new String[jsonArray.length()];
// looping through All Contacts
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject c = jsonArray.getJSONObject(i);
// Storing each json item in variable
String strCode = c.getString(TAG_CODE);
items[i] = c.getString(TAG_CODE);
System.out.println("Hello events " + items);
}
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
codeSpinner.setAdapter(adapter);
} catch (JSONException je) {
je.printStackTrace();
}
}
}
回答1:
You can Check the following code to parse an json data with spinner in android App:
public class ParseJsonAndroidExample extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parse_json_android_example);
final Spinner output = (Spinner) findViewById(R.id.output);
final Button bparsejson = (Button) findViewById(R.id.bparsejson);
String OutputData ;
ArrayList outputDataList = new ArrayList();
/************ Static JSON data ***********/
final String strJson = "{ "Android" :[{"id":"1",
"client_name":"Glasco Smith Klin",
"campaign_name":"Health Medicine Survay",
"question":"MODE OF COMPLAINT CAN BE GIVEN THROUGH __________________",
"option_A":"WRITTEN",
"option_B":"ORAL",
"option_C":"PHONE CALL",
"option_D":"ALL OF THE ABOVE",
"q_prefix":"GSKHMSQ"},
{"id":"2",
"client_name":"Glasco Smith Klin",
"campaign_name":"Health Medicine Survay",
"question":"ADDING NEW FIR CAN BE DONE FROM WHICH ROLE",
"option_A":"IO",
"option_B":"TRAFFIC",
"option_C":"SHO-CRIME",
"option_D":"ADMINISTRATOR",
"q_prefix":"GSKHMJD"}] }";
/******** Listener for button click ********/
bparsejson.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String OutputData = "";
JSONObject jsonResponse;
try {
/****** Creates a new JSONObject with name/value mappings from the JSON string. ********/
jsonResponse = new JSONObject(strJson);
/***** Returns the value mapped by name if it exists and is a JSONArray. ***/
/******* Returns null otherwise. *******/
JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");
/*********** Process each JSON Node ************/
int lengthJsonArr = jsonMainNode.length();
for(int i=0; i < lengthJsonArr; i++)
{
/****** Get Object for each JSON node.***********/
JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
/******* Fetch node values **********/
int id = Integer.parseInt(jsonChildNode.optString("id").toString());
String client_name = jsonChildNode.optString("client_name").toString();
String campaign_name= jsonChildNode.optString("campaign_name").toString();
String question= jsonChildNode.optString("question").toString();
String option_A= jsonChildNode.optString("option_A").toString();
String option_B= jsonChildNode.optString("option_B").toString();
String option_C= jsonChildNode.optString("option_C").toString();
String option_D= jsonChildNode.optString("option_D").toString();
String q_prefix= jsonChildNode.optString("q_prefix").toString();
OutputData += "Node : \n\n "+ id +" | "
+ client_name+" | "
+ campaign_name+"
+ question+" | "
+ option_A+" | "
+ option_B+" | "
+ option_C+" | "
+ option_D+" | "
+ q_prefix+" | " +"\n\n ";
}
outputDataList.add(OutputData);
/************ Show Output on Spinner **********/
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item ,outputDataList );
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
codeSpinner.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}
回答2:
Try like this, Use AsyncTask to Network Operation
"Unable to start Activity" and Java.lang.NullPointerException at the line of jsonArray = jSon.getJSONArray(TAG_CODE);
First use this code for Parsing
jsonArray = new JSONArray(jSon.toString());
final String[] items = new String[jsonArray.length()];
// looping through All Contacts
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject c = jsonArray.getJSONObject(i);
// Storing each json item in variable
String strCode = c.getString(TAG_CODE);
items[i] = c.getString(TAG_CODE);
System.out.println("Hello events " + items);
}
Then use item to ArrayAdapter
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item,items);
回答3:
you are not passing items Array to ArrayAdapter constructor do it as:
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item,items);
and instead of making webservice request from main thread use AsyncTask for doing operation in background and update UI elements when operation complete
回答4:
Issues and solution:
Check your logcat, it should be having NetworkOnMainThreadException, reason being is you are calling web API directly on main thread, starting from Honeycomb its not possible to implement long running task on Main UI Thread directly.
Solution is to implement threading mechanism, you can implement AsyncTask in android which is known as Painless Threading in Android.
There are issues in JSON parsing, you need to learn and understand JSON Parsing properly.
Issue example:
JSONObject jSon = jParser.getJSONFromUrl(strUrl);
System.out.println("Hello ********************");
try {
// Getting Array of Code
jsonArray = jSon.getJSONArray(TAG_CODE);
.....
.....
By looking at response given in question, I can say you are getting JSONArray directly in response instead of JSONObject.
2nd mistake in JSON Parsing is you are trying to getJSONArray(TAG_CODE) which is not required as you are already having JSONArray in response, you can just iterate through objects and can fetch whatever values you want.
回答5:
JSONObject jSon = jParser.getJSONFromUrl(strUrl);
your response is JsonArray not JsonObject
if Response starts with [ it is an jsonarray
if starts with { it is an jsonObject.
Use
public static int SDK_INT = android.os.Build.VERSION.SDK_INT;
if (SDK_INT >= 10) {
ThreadPolicy tp = ThreadPolicy.LAX;
StrictMode.setThreadPolicy(tp);
}
before parsing Json
or else use AsyncTask to get the Response
http://developer.android.com/reference/android/os/AsyncTask.html
来源:https://stackoverflow.com/questions/19922058/populate-the-spinner-from-json-in-android