获取服务器数据通过Gson解析显示Listview上
2017-06-13 10:39
483 查看
之前写了一篇博文是获取服务器数据并解析显示到listview上,上次使用的解析是通过jsonarray和jsonobject完成,解析json的数据还是可以,但是发现解析复杂点的数据真的很麻烦,然后查了一下Gson的解析方式写了一个demo,发现省事了许多.上代码:
效果图: 项目结构图:
1.json数据:
2、导入使用的架包okhttp(网络请求库)、Gson(谷歌Gson解析库)、Picasso(图片加载缓存库)
Gson库我直接在Androidstudio中添加,其他两个库我是复制到libs中
okhttp下载地址:http://download.csdn.net/detail/qq_26650589/9811409
Picasso下载:http://download.csdn.net/detail/qq_26650589/9695886
如何引用架包我就不详细写了,如果不知如何添加请看博文地址:http://blog.csdn.net/qq_26650589/article/details/73159658
3、activity_main.xml布局
一个简单的listview控件
创建布局listview_item,,用来显示每个listview的item内容,布局中代码:
4、创建实体类user,提供get,set方法(每个的名称必须和json数据的名称一致,否则运行显示为null)
5、修改MainActivity.java中代码:
6、创建适配器useradapter
7、最后一步添加权限:
在AndroidManifest.xml中添加访问网络权限
8、错误信息
(1)、如果你发现运行结果的信息显示为null,请检查实体类里的变量名称是否和json数据的内容相同
(2)、如果你发现报错的信息是: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 20 column 10 path $[2].counnt,请使用json工具检查json数据是否正确。
二、使用Gson解析稍微复杂json数据
json数据:
1、创建实体类
2、更改解析方法代码
一些listview适配代码就不贴了和上面一样就改了一下Gsonjx()方法里的代码
解析更多的json样式地址:https://github.com/IamXiaRui/Android_5.0_ViewDemo/tree/master/GsonArrayDemo
效果图: 项目结构图:
1.json数据:
[ { "title": "网络部", "date": "2017", "counnt": "16", "pic":"http://cdn-img.easyicon.net/png/11184/1118405.gif" }, { "title": "运营部", "date": "2017", "counnt": "6", "pic":"http://cdn-img.easyicon.net/png/11184/1118405.gif" }, { "title": "金融部", "date": "2017", "counnt": "20", "pic":"http://cdn-img.easyicon.net/png/11184/1118405.gif" }, { "title": "其他", "date": "2017", "counnt": "8", "pic":"http://cdn-img.easyicon.net/png/11184/1118405.gif" } ]
2、导入使用的架包okhttp(网络请求库)、Gson(谷歌Gson解析库)、Picasso(图片加载缓存库)
Gson库我直接在Androidstudio中添加,其他两个库我是复制到libs中
okhttp下载地址:http://download.csdn.net/detail/qq_26650589/9811409
Picasso下载:http://download.csdn.net/detail/qq_26650589/9695886
如何引用架包我就不详细写了,如果不知如何添加请看博文地址:http://blog.csdn.net/qq_26650589/article/details/73159658
3、activity_main.xml布局
一个简单的listview控件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.wdl.gson.MainActivity"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/lv"/> </RelativeLayou bb7e t>
创建布局listview_item,,用来显示每个listview的item内容,布局中代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.wdl.adapter.useradapter"> <LinearLayout android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="wrap_content"> <ImageView android:id="@+id/img" android:layout_gravity="center" android:layout_width="100dp" android:layout_height="50dp" android:gravity="center" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="match_parent" android:orientation="vertical" android:layout_height="wrap_content"> <TextView android:id="@+id/tv1" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:layout_marginTop="10dp" android:text="部门"/> <TextView android:id="@+id/tv2" android:layout_width="match_parent" android:gravity="center" android:layout_height="wrap_content" android:text="时间"/> <TextView android:id="@+id/tv3" android:layout_width="match_parent" android:gravity="center" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:text="人数"/> </LinearLayout> </LinearLayout> </LinearLayout>
4、创建实体类user,提供get,set方法(每个的名称必须和json数据的名称一致,否则运行显示为null)
public class user { private String title;//部门 private String date;//时间 private String counnt;//人数 private String pic;//图片 public user(String title, String date, String counnt,String pic) { this.title = title; this.date = date; this.counnt = counnt; this.pic=pic; } public String getTitle() { return title; } public String getPic() { return pic; } public void setPic(String pic) { this.pic = pic; } public void setTitle(String title) { this.title = title; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getCounnt() { return counnt; } public void setCounnt(String counnt) { this.counnt = counnt; } }
5、修改MainActivity.java中代码:
public class MainActivity extends AppCompatActivity { public String date; public ListView lv; public ArrayList<user> listuser; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv= (ListView) findViewById(R.id.lv); init(); //listview点击事件 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this,""+listuser.get(position).getTitle(),Toast.LENGTH_LONG).show(); } }); } //获取json数据部分 private void init() { new Thread(new Runnable() { public void run() { OkHttpClient okHttpClient = new OkHttpClient(); //服务器返回的地址 Request request = new Request.Builder() .url("http://192.168.1.154/user.json").build(); try { Response response = okHttpClient.newCall(request).execute(); //获取到数据 date = response.body().string(); //在线程中没有办法实现主线程操作 Message message = new Message(); message.what = 1; han.sendMessage(message); //把数据传入解析josn数据方法 Gsonjx(date); } catch (IOException e) { e.printStackTrace(); } } }).start(); } public android.os.Handler han = new android.os.Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: Toast.makeText(MainActivity.this,""+date,Toast.LENGTH_LONG).show(); break; case 2: lv.setAdapter(new useradapter(MainActivity.this, listuser));//调用listview适配器 break; } } }; private void Gsonjx(String date) { //gson解析部分 JsonParser parser = new JsonParser(); JsonArray jsonArray = parser.parse(date).getAsJsonArray(); Gson gson = new Gson(); listuser = new ArrayList<>(); for (JsonElement user : jsonArray) { user userBean = gson.fromJson(user, user.class); listuser.add(userBean); } Message message = new Message(); message.what = 2; han.sendMessage(message); } }
6、创建适配器useradapter
public class useradapter extends BaseAdapter { public Context con; public List<user> list; public LayoutInflater inflater; public useradapter(Context context, List<user> user){ this.con=context; this.list=user; inflater=LayoutInflater.from(con); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view= inflater.inflate(R.layout.listview_item,null); TextView tv1= (TextView) view.findViewById(R.id.tv1); TextView tv2= (TextView) view.findViewById(R.id.tv2); TextView tv3= (TextView) view.findViewById(R.id.tv3); ImageView img= (ImageView) view.findViewById(R.id.img); tv1.setText("部门:"+list.get(position).getTitle()); tv2.setText("时间:"+list.get(position).getDate()); tv3.setText("人数:"+list.get(position).getCounnt()); //判断获取的json中图片是否为空 if (TextUtils.isEmpty(list.get(position).getPic().toString())){ Picasso .with(con) .cancelRequest(img); img.setImageDrawable(con.getResources().getDrawable(R.mipmap.ic_launcher));//当图片为空时显示原始机器人图 }else { //图片加载 Picasso .with(con) .load(list.get(position).getPic().toString()) .placeholder(R.mipmap.ic_launcher)//图片加载中时显示原始机器人图 .into(img); } return view; } }
7、最后一步添加权限:
在AndroidManifest.xml中添加访问网络权限
<uses-permission android:name="android.permission.INTERNET" />
8、错误信息
(1)、如果你发现运行结果的信息显示为null,请检查实体类里的变量名称是否和json数据的内容相同
(2)、如果你发现报错的信息是: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 20 column 10 path $[2].counnt,请使用json工具检查json数据是否正确。
二、使用Gson解析稍微复杂json数据
json数据:
{ "result": "true", "counnts": 4, "user": [ { "title": "网络部", "date": "2017", "counnt": "16", "pic": "http://cdn-img.easyicon.net/png/11184/1118405.gif" }, { "title": "运营部", "date": "2017", "counnt": "6", "pic": "http://cdn-img.easyicon.net/png/11184/1118405.gif" }, { "title": "金融部", "date": "2017", "counnt": "20", "pic": "http://cdn-img.easyicon.net/png/11184/1118405.gif" }, { "title": "其他", "date": "2017", "counnt": "8", "pic": "http://cdn-img.easyicon.net/png/11184/1118405.gif" } ] }
1、创建实体类
public class UserBean { //变量名需要与json字段的名称一致 private String result; private int counnts; private List<user> user; public class user{ private String title; private String date; private String counnt; private String pic; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getCounnt() { return counnt; } public void setCounnt(String counnt) { this.counnt = counnt; } public String getPic() { return pic; } public void setPic(String pic) { this.pic = pic; } } public String getResult() { return result; } public void setResult(String result) { this.result = result; } public int getCounnts() { return counnts; } public void setCounnts(int counnts) { this.counnts = counnts; } public List<UserBean.user> getUser() { return user; } public void setUser(List<UserBean.user> user) { this.user = user; } }
2、更改解析方法代码
private void Gsonjx(String date) { UserBean resultBean = new Gson().fromJson(date,UserBean.class); List<UserBean.user> listuser = resultBean.getUser(); Message message = new Message(); message.what = 2; han.sendMessage(message); }
一些listview适配代码就不贴了和上面一样就改了一下Gsonjx()方法里的代码
解析更多的json样式地址:https://github.com/IamXiaRui/Android_5.0_ViewDemo/tree/master/GsonArrayDemo
相关文章推荐
- [置顶] 获取服务器json数据并解析显示listview上
- 通过HttpClient获取服务器接口json数据已及解析
- 从服务器上获取api接口数据 生成实体类并显示在listview或TextView中
- 通过GSON 解析Json数据,但是不创建JAVA Bean的方式,获取对应的值
- 使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析
- 带有侧滑菜单的+ 通过retrofit获取数据,通过fresco框架加载图片,使用TabLayout + ViewPage + Fragment + ListView 显示数据
- gson解析通过okhttp获取的json格式数据(转载)
- 通过jquery ajax在从服务器获取一个文件的数据,显示到客户端的页面
- 获取网络数据进行Gson解析用ListView展示
- Xcode9学习笔记74 - 读取和解析Plist属性列表文件(获取远程服务器信息并显示返回数据)
- 客户端与服务器通过gson解析json数据
- android:通过url向网络端获取json格式数据并解析显示
- XUtils访问服务器获取json数据,并用Gson解析json
- 模拟新闻客户端从服务器获取xml数据并显示到ListView
- Android学习 (十八) 用GSON解析JSON数据并在ListView中显示
- 通过HttpClient获取服务器接口json数据已及解析
- json数据解析,并实现将网络json数据获取用listview显示
- gson解析通过okhttp获取的json格式数据
- Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显示在客户端上面】)
- Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显示在客户端上面】)