代码之家  ›  专栏  ›  技术社区  ›  Sara.B

使用Gson从json(字符串)android读取

  •  1
  • Sara.B  · 技术社区  · 8 年前

    {"VisitorsList":[{"VisitorID":"09005451","VisitorName":" xxxx","VisitorPhon":"","VisitorAddr":"xxxx","GeoCode":"","AutoKey":1},{"VisitorID":"09005468","VisitorName":"xxxxxx","VisitorPhon":"09005468","VisitorAddr":"xxxx","GeoCode":"","AutoKey":2}]}
    

    public class VisitorsListActivity extends AppCompatActivity {
    
    public ListView lstVisitors;
    static VisitorsList visitorsList;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.visitor_list);
    
        try {
    
            //********************************** COMELETE THIS SECTION *********************************************
    
            new JsonHelper.GetJsonData(new JsonHelper.GetJsonData.AsyncResponse() {
    
                @Override
                public void processFinish(String output) {
                    try {
                        if (output == null) output = "";
                        if (output.equals("")) {
                            Toast.makeText(getApplicationContext(),
                                    "No Visitor Founded",
                                    Toast.LENGTH_LONG)
                                    .show();
                            return;
                        }
                        //960105--------------------
                        else if (output.equals("401")) {
                            Toast.makeText(getApplicationContext(),
                                    "Error 401",
                                    Toast.LENGTH_LONG)
                                    .show();
                            return;
                        }
                        //--------------------------------------
    
                        Log.i("LOG", "output" + output);
                        Gson gson = new Gson();
                        output = output.substring(1, output.length() - 1);
    
                        /*Toast.makeText(getApplicationContext(),
                                output,
                                Toast.LENGTH_LONG)
                                .show();*/
    
                        visitorsList = new VisitorsList();
                        visitorsList = gson.fromJson(output, VisitorsList.class);
    
                    } catch (Exception e) {
                        e.printStackTrace();
    
                        Toast.makeText(getApplicationContext(),
                                "exception",
                                Toast.LENGTH_LONG)
                                .show();
                    }
                }
            }).execute("http://192.168.1.162:8014/api/Visitors");
    
    
            //************************************ visitor list is null :| *******************************************
    
    
            /*if( visitorsList == null) {
                Toast.makeText(getApplicationContext(),
                        "data is nul",
                        Toast.LENGTH_LONG)
                        .show();
            }*/
    
            AdapterVisitor customAdapter = new AdapterVisitor(this, R.layout.visitor_list, visitorsList.VisitorsList);
            customAdapter.notifyDataSetChanged();
            lstVisitors.setAdapter(customAdapter);
    
            lstVisitors.requestFocus();
    
            final ViewGroup layoutClear = (ViewGroup) findViewById(R.id.layoutClear);
            layoutClear.setVisibility(View.GONE);
    
        } catch (Exception e) {
            e.getMessage();
        }
    
    } }
    

    和访客列表:

    public class VisitorsList {
    
    public VisitorsList() {}
    
    public ArrayList<Visitors> VisitorsList;}
    

    访客:

    public class Visitors {
    public String VisitorID;
    public String VisitorName;
    public String VisitorPhon;
    public String VisitorAddr;
    public String GeoCode;
    public int AutoKey;}
    

    jsonhelper:

    public class JsonHelper {
    
    public static class GetJsonData extends AsyncTask<String, Void, String> {
    
        public interface AsyncResponse {
    
            void processFinish(String output);
        }
    
        public AsyncResponse delegate = null;
    
    
        public GetJsonData(AsyncResponse delegate) {
            this.delegate = delegate;
        }
    
    
        @Override
        protected String doInBackground(String... strUrl) {
    
            String str = strUrl[0];
            URLConnection urlConn = null;
            BufferedReader bufferedReader = null;
            try {
                URL url = new URL(str);
                urlConn = url.openConnection();
                urlConn.setReadTimeout(300000);
                urlConn.setConnectTimeout(5000);
    
                bufferedReader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "utf-8"), 8);
    
                StringBuffer stringBuffer = new StringBuffer();
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    stringBuffer.append(line);
                }
                String tmpJson = stringBuffer.toString().replace("\\", "");
    
                return tmpJson;
            } catch (Exception ex) {
                ex.getMessage();
    
                return null;
            } finally {
                if (bufferedReader != null) {
                    try {
                        bufferedReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
    
                    }
                }
            }
        }
    
    
        @Override
        protected void onPostExecute(String response) {
            delegate.processFinish(response);
        }
    }
    
    
    public static class SetJsonData extends AsyncTask<String, Void, String> {
    
        String responseServer;
    
    
        public interface AsyncResponse {
    
            void processFinish(String output);
        }
    
        public AsyncResponse delegate = null;
    
    
        public SetJsonData(AsyncResponse delegate) {
            this.delegate = delegate;
        }
    
    
        @Override
        protected String doInBackground(String... param) {
            URL url;
            String response = null;
            try {
    
                url = new URL(param[0]);
                HttpURLConnection conn = null;
                conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(20000);
                conn.setConnectTimeout(10000);//950718
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                conn.setDoOutput(true);
                OutputStream os = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
                writer.write(param[1]);
                writer.flush();
                writer.close();
                os.close();
                int responseCode = conn.getResponseCode();
                if (responseCode == HttpsURLConnection.HTTP_OK) {
                    String line;
                    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                    while ((line = br.readLine()) != null) {
                        response += line;
                    }
                } else {
                    response = (String.valueOf(responseCode));
                    String line;
                    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));//950427
                    while ((line = br.readLine()) != null) {
                    }
    
                }
                return response;
            } catch (IOException e1) {
                e1.getMessage();
    
                return null;
            } catch (Exception e) {
                 e.getMessage();
                return null;
            }
        }
    
        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            try {
                super.onPostExecute(result);
                delegate.processFinish(result);
            } catch (Exception e) {
                e.getMessage();
            }
        }
    
    }}
    
    6 回复  |  直到 8 年前
        1
  •  0
  •   Nenco    8 年前

    你的访客类缺少批注。 使用此选项可以正确转换: http://www.jsonschema2pojo.org/

        2
  •  0
  •   Sunil P    8 年前
        3
  •  0
  •   Oussema Aroua    8 年前

    嗯,首先阅读 AsyncResponse 异步请求不会阻止客户端,因此当响应返回时,它会继续执行代码,并执行回调中的内容。 customAdapter.notifyDataSetChanged(); 外部 processFinish() 你需要打电话进去或者打电话给 Adapter processFinish 方法

        4
  •  0
  •   Anshul gour    8 年前

    公共类访问者列表{

        5
  •  0
  •   Yessine Mahdouani    8 年前

    访问者列表类:

    public class VisitorsList {
    
    
            @SerializedName("VisitorsList")
            public List<VisitorsList> VisitorsList;
    
            public static class VisitorsList {
                @SerializedName("VisitorID")
                public String VisitorID;
                @SerializedName("VisitorName")
                public String VisitorName;
                @SerializedName("VisitorPhon")
                public String VisitorPhon;
                @SerializedName("VisitorAddr")
                public String VisitorAddr;
                @SerializedName("GeoCode")
                public String GeoCode;
                @SerializedName("AutoKey")
                public int AutoKey;
            }
        }
    

    删除此行

     output = output.substring(1, output.length() - 1);
    

    并获得您的结果:

     Gson gson = new Gson();
    visitorsList=gson.fromJson(output), new TypeToken<VisitorsList>() { }.getType());
    
        6
  •  0
  •   Sara.B    8 年前

    我将VisitorsListActivity更改为如下所示。并在调用适配器之前设置一个条件,以确保已完成从json读取信息,这可以正确工作:

    new JsonHelper.GetJsonData(new JsonHelper.GetJsonData.AsyncResponse() {
    
            @Override
            public void processFinish(String output) {
                try {
                    if (output == null) output = "";
                    if (output.equals("")) {
                        Toast.makeText(getApplicationContext(),
                                "No Visitor Founded",
                                Toast.LENGTH_LONG)
                                .show();
                        return;
                    }
    
                    else if (output.equals("401")) {
                        Toast.makeText(getApplicationContext(),
                                "Error 401",
                                Toast.LENGTH_LONG)
                                .show();
                        return;
                    }
    
                    Log.i("LOG", "output" + output);
                    Gson gson = new Gson();
                    output = output.substring(1, output.length() - 1);
    
    
                    try {
                        visitorsList = new VisitorsList();
                        visitorsList = gson.fromJson(output, VisitorsList.class);
                        if(visitorsList != null) {
                            d.cancel();
                            adapter = new AdapterVisitor(visitorsList.VisitorsList);
                            adapter.notifyDataSetChanged();
                            lstVisitors.setAdapter(adapter);
    
                            lstVisitors.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                public void onItemClick(AdapterView<?> parent, View view,
                                                        int position, long id) {
                                    // ******
                                    Object o = lstVisitors.getItemAtPosition(position);
                                    Intent i = new Intent(getApplicationContext(),DateSelectorActivity.class);
                                    Visitors v = (Visitors) o;
                                    i.putExtra("VisitorID", v.VisitorID);
                                    startActivity(i);
                                }
                            });
                        }
    
                    }catch (Exception e) {
                        Log.i("LOG", getAssets().toString() + "exception" + e);
                    }
    
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
        }).execute(url);