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

 package com.example.servlet;

 public class User {

      private String name;
private int age;
public User(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} }

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

Servletdemo

 package com.example.servlet;

 import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONArray;
import net.sf.json.JSONObject; @WebServlet("/Servletdemo")
public class Servletdemo extends HttpServlet {
private static final long serialVersionUID = 1L;
private List<User> list; public Servletdemo() {
super();
// TODO Auto-generated constructor stub
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
PrintWriter printWriter=response.getWriter();//用PrintWriter在Web端打印数据 setuser();
JSONArray array=new JSONArray();
for (User object : list)
{
JSONObject jsonObject=new JSONObject();
try
{
jsonObject.put("name",object.getName());
jsonObject.put("age", object.getAge()); }
catch (Exception e)
{
// TODO: handle exception }
array.add(jsonObject); }
printWriter.println(array.toString());
printWriter.flush();
printWriter.close();
}
/**往list中添加User对象*/
private void setuser()
{
list=new ArrayList<User>();
for(int i=0;i<3;i++)
{
User user=new User();
user.setName("张三"+i);
user.setAge(i*10);
list.add(user);
} } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
} }

准备好这些以后,就剩下将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来返回数据。

 package com.example.jsonanalysis;

 import java.io.BufferedReader;
import java.io.InputStreamReader; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient; public class HttpUtils { public static String getData(String url) throws Exception { StringBuilder stb = new StringBuilder();
HttpClient httpClient = new DefaultHttpClient();
HttpGet get=new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(get);
HttpEntity httpEntity = httpResponse.getEntity(); if (httpEntity != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(httpEntity.getContent())); String line = null; while ((line = reader.readLine()) != null) { stb.append(line); } return stb.toString(); } return null;
}
}

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的代码。

 package com.example.jsonanalysis;

 import org.json.JSONArray;
import org.json.JSONObject; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView; public class MainActivity extends Activity { private TextView textview;
private static String url="http://192.168.2.4:8080/ServletText/Servletdemo";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview=(TextView)findViewById(R.id.text);
new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
try {
String str1=HttpUtils.getData(url);
StringBuilder str2=new StringBuilder();
JSONArray array=new JSONArray(str1);
for(int i=0;i<array.length();i++)
{
JSONObject obj = array.getJSONObject(i);
str2.append("age:").append(obj.getInt("age")).append(" ");
str2.append("name:").append(obj.getString("name")).append("\n");
str2.append("----------------------\n" );
}
textview.setText(str2.toString()); } catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace(); }
}
}).start();
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

main-activity

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

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

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

  1. android之JSON 进行网络数据交换

    什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同一时候也易于机器解析和生成,很适合于server与client的交互. J ...

  2. Android Volley和Gson实现网络数据加载

    Android Volley和Gson实现网络数据加载 先看接口 1 升级接口 http://s.meibeike.com/mcloud/ota/cloudService POST请求 参数列表如下 ...

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

    JQuery + JSON作为前后台数据交换 JQuery提供良好的异步加载接口AJAX,可以局部更新页面数据, http://api.jquery.com/category/ajax/ JSON作为 ...

  4. 二维码与json都是数据交换格式

    二维码与json都是数据交换格式: UI数据是人机数据交换格式.

  5. Android中解析JSON形式的数据

    1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, ...

  6. android基础(五)网络数据解析方法

    在网络上传输数据时最常用的方法有两种:XML和JSON,下面就对这两种类型的数据解析进行讲解. 一.XML数据解析 在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析 ...

  7. Android Volley获取json格式的数据

    为了让Android能够快速地访问网络和解析通用的数据格式Google专门推出了Volley库,用于Android系统的网络传输.volley库可以方便地获取远程服务器的图片.字符串.json对象和j ...

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

    使用Volley传输网络数据(Transmitting Network Data Using Volley) Volley 是一个 HTTP 库,它使得在Android应用程序中操作网络更容易,是重要 ...

  9. Android Fragment与Activity之间的数据交换(Fragment从Activity获取数据)

    Fragment与Activity之间的数据交换,通常含有3: 一.Fragment从Activity获取数据(仅本文介绍了一个第一): 两.Activity从Fragment获取数据: 三.Frag ...

随机推荐

  1. java 动态代理学习(Proxy,InvocationHandler)

    前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...

  2. Unity 随机数的使用

    脚本语言:C# 一个比较常用的例子是游戏中的主角碰到场景中的NPC时,NPC会随机做出反应,例如有50%几率来友好的致敬,25%几率走开,20%几率反身攻击和%%的几率赠送礼物. 创建一个NPCTes ...

  3. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  4. Qt入门(9)——Qt中的线程支持

    Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法.警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心 ...

  5. uri编解码

    相关函数如下:(都是全局函数) encodeURI(URIString):将文本字符串编码为有效的统一资源标示符URI decodeURI(URIString) encodeURIComponent( ...

  6. Java---对象与类的封装

    一.类和对象: package cn.hncu.Myclasslearn; /** * * @author hncu_chx * * Mylove amin */ /**类是一种数据类型,声明一个类就 ...

  7. USACO月赛数据

    终于找到了usaco月赛的数据…… 根据月赛的名称,我们可以写出数据地址.比如08年一月的月赛即是:http://contest.usaco.org/JAN08  这里要注意区分大小写.

  8. 《ACM国际大学生程序设计竞赛题解Ⅰ》——模拟题

    这篇文章来介绍一些模拟题,即一类按照题目要求将现实的操作转换成程序语言. zoj1003: On every June 1st, the Children's Day, there will be a ...

  9. Simpsons’ Hidden Talents - HDU 2594(求相同的前缀后缀)

    题目大意:给你两个字符串,找出一个最大的子串,这个子串要是前面串的前缀并且是后面串的后缀...........   分析:next的简单运用吧,可以把两个串进行合并,中间加一个不能被匹配的字符,然后求 ...

  10. C - How Many Tables - HDU-1213

    某个人举办生日宴会邀请了很多人来参加,不过呢,这些人有个毛病他们只会与熟悉人的坐在一起,当然他们也信奉朋友的朋友也是朋友这一法则,所以问最少需要多少张桌子...... 好吧我承认这才是裸并查集.... ...