[英]Populate the spinner from JSON in Android
我有這樣的JSON數據:
[{"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"}]
我想將所有q_prefix
列檢索到微調器中。 但是在我的微調器中沒有顯示任何數據。 當我運行我的應用程序,我得到一個錯誤:“無法啟動活動”,並Java.lang.NullPointerException
在這一行: jsonArray = jSon.getJSONArray(TAG_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<String> codeList = new ArrayList<String>();
// 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<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
codeSpinner.setAdapter(adapter);
} catch (JSONException je) {
je.printStackTrace();
}
}
}
您可以在Android App中檢查以下代碼以使用Spinner解析json數據:
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<String> outputDataList = new ArrayList<String>();
/************ 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<String> adapter = new ArrayAdapter<String>(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();
}
}
});
}
}
嘗試這樣,使用AsyncTask
進行網絡操作
“無法啟動活動”和Java.lang.NullPointerException
在j的線sonArray = jSon.getJSONArray(TAG_CODE);
首先使用此代碼進行解析
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);
}
然后使用項目到ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item,items);
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.
采用
public static int SDK_INT = android.os.Build.VERSION.SDK_INT;
if (SDK_INT >= 10) {
ThreadPolicy tp = ThreadPolicy.LAX;
StrictMode.setThreadPolicy(tp);
}
解析Json之前
否則使用AsyncTask獲得響應
http://developer.android.com/reference/android/os/AsyncTask.html
您沒有將items
Array傳遞給ArrayAdapter
構造函數,方法是:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item,items);
而不是從主線程發出Web服務請求,而是使用AsyncTask在后台執行操作,並在操作完成后更新UI元素
問題與解決方案:
檢查您的logcat,它應該具有NetworkOnMainThreadException ,原因是您是直接在主線程上調用Web API,從Honeycomb開始,不可能直接在Main UI Thread上實現長時間運行的任務。
解決方案是實現線程機制,您可以在android中實現AsyncTask ,這在Android中稱為無痛線程 。
JSON解析中存在問題,您需要正確學習和理解JSON解析 。
問題示例:
JSONObject jSon = jParser.getJSONFromUrl(strUrl);
System.out.println("Hello ********************");
try {
// Getting Array of Code
jsonArray = jSon.getJSONArray(TAG_CODE);
.....
.....
通過查看有問題的響應,我可以說您是直接在響應中獲取JSONArray而不是JSONObject。
JSON解析中的第二個錯誤是您嘗試獲取不是必需的JSONArray(TAG_CODE),因為您已經有JSONArray作為響應,您可以遍歷對象並獲取所需的任何值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.