【问题标题】:Populate the spinner from JSON in Android在 Android 中从 JSON 填充微调器
【发布时间】:2013-11-12 06:03:35
【问题描述】:

我有这样的 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 列检索到微调器中。但是在我的微调器中没有显示数据。当我运行我的应用程序时,我收到一个错误:“无法启动 Activity”,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();

        }

    }

}

【问题讨论】:

  • 使用 asynTask 获取响应
  • getJSONFromUrl 是否正在使用AsyncTask 进行网络服务调用?请确保它发布了与初始化微调器相关的内容。

标签: java android json


【解决方案1】:

您可以检查以下代码以在android App中使用微调器解析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();
            }

        }
    });
 }
}

【讨论】:

  • JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");
  • "Android" 在我的 JSON 格式中是空白的,所以我必须在这里替换。我可以把“id”实体 JSONArray jsonMainNode = jsonResponse.optJSONArray("id").
  • 我对代码进行了更改并收到警告字符串无法转换为 JSON 对象
【解决方案2】:

这样试试,用AsyncTask网络操作

jsonArray = jSon.getJSONArray(TAG_CODE);这一行的“无法启动Activity”和Java.lang.NullPointerException

先用这段代码解析

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);

【讨论】:

  • 我尝试使用 AsyncTask。但它显示了很多错误。我不知道如何将此代码放入 AsyncTask。你能给我一些想法如何做到这一点。
  • @tazeenmulani 在哪一行出现异常?
  • jsonArray = new JSONArray(jSon.toString());
  • 我将所有 JSON 代码放入 @Override protected String doInBackground(String... params) 中,但它显示了很多红色错误。
  • 你在吗。你能帮我怎么办吗?
【解决方案3】:

你没有将 items 数组传递给 ArrayAdapter 构造函数,这样做:

 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item,items);

而不是从主线程发出 Web 服务请求,而是使用 AsyncTask 在后台进行操作并在操作完成时更新 UI 元素

【讨论】:

【解决方案4】:

问题及解决方案:

  1. 检查你的logcat,它应该有NetworkOnMainThreadException,原因是你直接在主线程上调用Web API,从Honeycomb开始它不可能直接在主UI线程上实现长时间运行的任务。

    解决方案是实现线程机制,可以在android中实现AsyncTask,在Android中称为Painless Threading

  2. JSON解析有问题,需要好好学习理解JSON Parsing

问题示例:

 JSONObject jSon = jParser.getJSONFromUrl(strUrl);
        System.out.println("Hello ********************");

        try {
            // Getting Array of Code
            jsonArray = jSon.getJSONArray(TAG_CODE);

             .....
             .....

通过查看有问题的响应,我可以说您直接得到 JSONArray 而不是 JSONObject。

JSON 解析中的第二个错误是您尝试获取不需要的 getJSONArray(TAG_CODE),因为您已经有 JSONArray 作为响应,您可以遍历对象并获取您想要的任何值。

【讨论】:

    【解决方案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.
    

    使用

      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

    【讨论】:

    • 在使用上面的代码行时我仍然遇到同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 2013-04-01
    • 1970-01-01
    • 2011-01-12
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多