android json spinner,Populate the spinner from JSON in Android

问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值