Android之使用json进行网络数据交换

JSON作为一种轻量级的数据交换格式,凭借其易于阅读和编写、易于解析、传输速度快等优点流行了起来。最近正好在学习Android端从服务端端取数据,Json便派上了用场。好,下面开始切入主题。

1.准备好服务端

首先我们要有个服务器,我用的是Tomcat7.0,这里具体Tomcat的安装过程我就不加以描述了。服务器配置过程如下。

我们在File-new -other中找到server,next然后在Apache中找到tomcat7.0,我这里将server的名字改为了Myserve,点击finish。

完成上诉步骤后可以看到Package Explorer中出现了Servers项目,打开里面有个Myserver-config,同时这就是我先前配置的服务器。

第二步。建立Web项目。同样在new-other-web中找到Dynamic Web Project,点击next,我这里为项目取名ServletText,记得讲Target runtime改为Tomcat7.0。

别急着finish,点两下next后可以看见有个框没打钩,那是提示是否生成web.xml用的,大家可根据项目中实际需求是否勾选,我们这里不予理会,点击fiish.

这样我们就可以在Package Explorer找到SerletText项目了,我们在其src中先建立个包com.example.servlet,如何我们开始准备web端的数据。先给大家看下我的项目架构。

首先我们要导入一些json和servlet的jar包。json的jar包网上可以下载的到,servlet的jar包可以先找到Tomcat的安装位置的文件夹,在Tomcat的libs中直接可以找到。

如何我创建的一个User类,代码很简单。

User

 1 package com.example.servlet;
 2
 3 public class User {
 4
 5      private String name;
 6         private int age;
 7         public User(){}
 8         public String getName() {
 9             return name;
10         }
11         public void setName(String name) {
12             this.name = name;
13         }
14         public int getAge() {
15             return age;
16         }
17         public void setAge(int age) {
18             this.age = age;
19         }
20
21
22 }

如何我们再建立个Servlet类,取名ServletDemo。代码如下。

Servletdemo

 1 package com.example.servlet;
 2
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7
 8 import javax.servlet.ServletException;
 9 import javax.servlet.annotation.WebServlet;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 import net.sf.json.JSONArray;
15 import net.sf.json.JSONObject;
16
17
18 @WebServlet("/Servletdemo")
19 public class Servletdemo extends HttpServlet {
20     private static final long serialVersionUID = 1L;
21     private List<User> list;
22
23     public Servletdemo() {
24         super();
25         // TODO Auto-generated constructor stub
26     }
27
28     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
29         // TODO Auto-generated method stub
30          response.setContentType("text/plain");
31          response.setCharacterEncoding("UTF-8");
32          PrintWriter printWriter=response.getWriter();//用PrintWriter在Web端打印数据
33
34          setuser();
35          JSONArray array=new JSONArray();
36             for (User object : list)
37             {
38                JSONObject jsonObject=new JSONObject();
39                try
40                {
41                  jsonObject.put("name",object.getName());
42                  jsonObject.put("age", object.getAge());
43
44                }
45                catch (Exception e)
46                {
47                 // TODO: handle exception
48
49                }
50                array.add(jsonObject);
51
52             }
53             printWriter.println(array.toString());
54             printWriter.flush();
55             printWriter.close();
56     }
57     /**往list中添加User对象*/
58     private void setuser()
59     {
60         list=new ArrayList<User>();
61          for(int i=0;i<3;i++)
62             {
63                 User user=new User();
64                 user.setName("张三"+i);
65                 user.setAge(i*10);
66                 list.add(user);
67             }
68
69     }
70
71     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
72         // TODO Auto-generated method stub
73         doGet(request, response);
74     }
75
76 }

准备好这些以后,就剩下将ServletDemo部署到服务器上了。鼠标右击ServletDemo(不是ServletText整个项目),run as -- run on server,出现下图,然后next-finish。可以看见内容已经打印在了http://localhost:8080/ServletText/Servletdemo上。至此,服务端已经准备好了。

2.Android接收并解析Json

首先我们建立一个Android项目,取名JsonAnalysis。这里我们先把一些易忘的事情做了。

在AndroidManifest中添加访问网络权限。

    <uses permissionandroid:name="android.permission.INTERNET"/>

在lib中导入以下jar包。

完成这些后,我们开始制作布局。布局也相当简单,扔一个Textview进去就行了。

<?xml version= "1.0"  encoding= "utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >  

    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text"/>  

</LinearLayout>  

接下来开始实现功能。我这里封了一个工具类HttpUtils,由于我并没有任何web基础,在这里可费了不少功夫。在这个类中其实还可以设置如网络超时参数等东西,不过我都省略了,只做了些必不可少的工作。另外用了可变长度字符串StringBuilder来返回数据。

 1 package com.example.jsonanalysis;
 2
 3 import java.io.BufferedReader;
 4 import java.io.InputStreamReader;
 5
 6 import org.apache.http.HttpEntity;
 7 import org.apache.http.HttpResponse;
 8 import org.apache.http.client.HttpClient;
 9 import org.apache.http.client.methods.HttpGet;
10 import org.apache.http.impl.client.DefaultHttpClient;
11
12
13 public class HttpUtils {
14
15
16
17      public static String getData(String url) throws Exception {
18
19
20             StringBuilder stb = new StringBuilder();
21             HttpClient httpClient = new DefaultHttpClient();
22             HttpGet get=new HttpGet(url);
23             HttpResponse httpResponse = httpClient.execute(get);
24             HttpEntity httpEntity = httpResponse.getEntity();
25
26             if (httpEntity != null) {
27
28                 BufferedReader reader = new BufferedReader(new InputStreamReader(httpEntity.getContent()));
29
30                 String line = null;
31
32                 while ((line = reader.readLine()) != null) {
33
34                     stb.append(line);
35
36                 }
37
38                 return stb.toString();
39
40             }
41
42             return null;
43 }
44 }

HttpUtils

最后是在主activity中有些小细节需注意。

1.访问本地地址的确定。

有很多人说什么访问后台地址不是127.0.0.2,应是10.0.2.2,其实并不都是如此,我并不是很懂这些,一开始两种都试了一下,发现都不行。后来是在cmd中输入ipconfig才找到正确访问地址。所以我这里访问地址为 http://192.168.2.4:8080/ServletText/Servletdemo

2.数据的获取

Android4.0以后就不能再主线程中发起网络请求,可用异步请求或另起一条线程。我这里是在主线程中另起一条线程。

new Thread(new Runnable()
 {
    @Override
    public void run()
       {
        //获取数据的代码

    }
}).start();

下面是主activity的代码。

 1 package com.example.jsonanalysis;
 2
 3 import org.json.JSONArray;
 4 import org.json.JSONObject;
 5
 6 import android.os.Bundle;
 7 import android.app.Activity;
 8 import android.view.Menu;
 9 import android.widget.TextView;
10
11 public class MainActivity extends Activity {
12
13     private TextView textview;
14     private static String url="http://192.168.2.4:8080/ServletText/Servletdemo";
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.activity_main);
19         textview=(TextView)findViewById(R.id.text);
20         new Thread(new Runnable() {
21
22             @Override
23             public void run() {
24                 // TODO Auto-generated method stub
25                 try {
26                     String str1=HttpUtils.getData(url);
27                     StringBuilder str2=new StringBuilder();
28                     JSONArray array=new JSONArray(str1);
29                     for(int i=0;i<array.length();i++)
30                     {
31                           JSONObject obj = array.getJSONObject(i);
32                             str2.append("age:").append(obj.getInt("age")).append("  ");
33                             str2.append("name:").append(obj.getString("name")).append("\n");
34                             str2.append("----------------------\n" );
35                     }
36                     textview.setText(str2.toString());
37
38                 } catch (Exception e)
39                 {
40                     // TODO Auto-generated catch block
41                     e.printStackTrace();
42
43                 }
44             }
45         }).start();
46     }
47
48     @Override
49     public boolean onCreateOptionsMenu(Menu menu) {
50         // Inflate the menu; this adds items to the action bar if it is present.
51         getMenuInflater().inflate(R.menu.main, menu);
52         return true;
53     }
54
55 }

main-activity

下面是效果图,大家可以看见已经成功获取数据了。

希望可以帮助到有些正在学习这块,也遇到相同问题的人。

Android之使用json进行网络数据交换

时间: 2024-11-09 08:15:50

Android之使用json进行网络数据交换的相关文章

android之JSON 进行网络数据交换

什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同一时候也易于机器解析和生成,很适合于server与client的交互. JSON 採用与编程语言无关的文本格式,可是也使用了类C 语言的习惯.这些特性使JSON 成为理想的数据交换格式. 和 XML 一样,JSON 也是基于纯文本的数据格式.因为 JSON 天生是为 JavaScript 准备的,因此.JSON 的数据格式很easy,您能够用 JSON 传输一个简单的 S

JQuery + JSON作为前后台数据交换格式实践

JQuery + JSON作为前后台数据交换 JQuery提供良好的异步加载接口AJAX,可以局部更新页面数据, http://api.jquery.com/category/ajax/ JSON作为一种轻量数据格式,被浏览器js引擎普遍支持,同xml格式. 使用AJAX+JSON数据格式来实现动态页面,有以下好处: 1. 松耦合, 页面HTML和数据彻底分离, 即表示层 和 数据层分开, 有利前台样式定制. 不同于以往后台脚本嵌套HTML标签,并输出数据到标签的合适位置, 来实现动态页面,表示

Android中解析JSON形式的数据

1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. 2.JSON的结构: (1) Name/Value Pairs(无序的):类似所熟知的Keyed list. Hash table.Disctionary和Assoc

Android Volley获取json格式的数据

为了让Android能够快速地访问网络和解析通用的数据格式Google专门推出了Volley库,用于Android系统的网络传输.volley库可以方便地获取远程服务器的图片.字符串.json对象和json对象数组等.当然,java本身也有获取json对象的方法,然而为了更好地适应移动互联网,google专门为其做了特殊的优化,因而应该尽可能地使用Volley库. Volley官方文档:https://developer.android.com/training/volley/index.htm

Android利用wireshark抓取网络数据包

Android利用tcpdump和wireshark抓取网络数据包:http://blog.csdn.net/forlong401/article/details/23538737 Mac OS X上使用Wireshark抓包:http://blog.csdn.net/phunxm/article/details/38590561 Mac mini下wireshark抓包的使用:http://blog.sina.com.cn/s/blog_50da19a50101nxzn.html 如何mac下

android基础(六)网络数据解析方法

在网络上传输数据时最常用的方法有两种:XML和JSON,下面就对这两种类型的数据解析进行讲解. 一.XML数据解析 在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析器. (1)SAX解析 SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理.在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器

Android训练课程(Android Training) - 使用Volley传输网络数据(Transmitting Network Data Using Volley)

Volley is an HTTP library that makes networking for Android apps easier and most importantly, faster. Volley is available through the open AOSP repository. Volley offers the following benefits: Automatic scheduling of network requests. Multiple concu

Android一个Fragment展示列表网络数据

NewsFragment展示新闻列表的Fragment NewsFragment类继承实现ResponseListener<LinkedList<NewsModel>>接口实现网络请求的响应回调 实现AdapterView.OnItemClickListener接口用于实现列表点击的监听 // 设置新闻 mList = (ListView) mViewGroup.findViewById(R.id.newsList); // 设置新闻列表点击监听事件 mList.setOnItem

Android两个Activity之间的数据交换

1. 不带数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); next=(Button)findViewById(R.id.next); next.setOnClickListener(new Button.OnClickListener() { @Override