android的json数据解析,Android解析Json数据之Gson解析

Gson是谷歌官方提供的解析json数据的工具类。json数据的解析能够使用JSONObject和JSONArray配合使用解析数据,可是这样的原始的方法对于小数据的解析还是有作用的,可是陪到了复杂数据的解析,就非常难完毕任务。

Gson这个java类库能够把java对象转换成JSON,也能够把JSON字符串转换成一个相等的java对象。

以下我们来看一下详细的Gsom解析数据的过程。首先我们在server端定义了四种数据:各自是Person对象,List。List,List>

public class JsonService {

public JsonService() {

// TODO Auto-generated constructor stub

}

public Person getPerson(){

Person person =new Person(1001,"呆呆","成都双流");

return person;

}

public List getlistperson(){

List list =new ArrayList<>();

Person person1 =new Person(1001, "哈哈", "广东");

Person person2 =new Person(1002, "呵呵", "成都");

list.add(person1);

list.add(person2);

return list;

}

public List getListString(){

List list =new ArrayList<>();

list.add("北京");

list.add("成都");

list.add("双流");

return list;

}

public List> getListMaps(){

List> list =new ArrayList<>();

Map map1 =new HashMap();

map1.put("id", "1001");

map1.put("name", "呆呆");

map1.put("address", "成都");

Map map2 =new HashMap();

map2.put("id", "1002");

map2.put("name", "好痒");

map2.put("address", "双流");

list.add(map1);

list.add(map2);

return list;

}知道了server上的详细数据之后。我们新建一个Androidproject,定义四个button。分别实现对Person对象。List,List,List>的解析功能。详细的xml布局代码这里就不做演示,读者自行创建。

由于Gson是使用的第三方框架,所以我们须要在project项目的lib目录下导入对应的jar文件,这里我们使用的gson-2.2.1.jar。由于从server获取数据须要用到网络,我们须要在AndroidMainfest.xml文件里获取网络请求权限:创建对应的Person类,类中包括了id、name、address的set/get方法,以及一个tostring方法还有构造函数。具体代码不做具体描写叙述。

想要获取网络上的数据,就须要一个网络訪问类,打开网络訪问连接获取详细的数据:(若对当中某些代码有疑惑能够查看上一篇XML文件解析,有详细的代码解释这里不做赘述)

public class HttpUtils {

public HttpUtils() {

}

public static String getJsonContent(String url_path) {

try {

//定义http的链接,设置链接时长为3s,使用get方法获取数据

URL url = new URL(url_path);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setConnectTimeout(3000);

connection.setRequestMethod("GET");

connection.setDoInput(true);

int code = connection.getResponseCode();

if (code == 200) {

return changeInputStrean(connection.getInputStream());

}

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

//把字符串从outputString流里面写入ByteArrayOutputStream中,转换成字节数组。在构建一个新的字符串

private static String changeInputStrean(InputStream inputStream) {

String jsonString = null;

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

int len = 0;

byte[] data = new byte[1024];

try {

while ((len = inputStream.read(data)) != -1) {

outputStream.write(data, 0, len);

}

jsonString = new String(outputStream.toByteArray());

} catch (IOException e) {

e.printStackTrace();

}

return jsonString;

}

}全部东西准备就绪,接下来须要做的就是定义Gson的工具类了。在这里我们要明确的是server将详细的数据对象使用Gson转换成了Json字符串。那么client须要做的就是将json字符串还原成原来的对象,那么我们这里定义的Gson工具类,一定是要可以满足各种数据对象的。也就是说无论server传递什么样的对象。作为client仅仅须要知道对象的类型就行将对象还原,所以在这里我们使用了泛型T的方式来定于

public class GsonTools {

public GsonTools() {

}

//使用泛型,不须要知道server端返回的是什么对象。server端gson解析成字符串返回后。都会解析成原来的对象

/**

*

* @param jsonstring

* @param cls

* @param server端的对象使用Gson解析成json字符串,client将json字符串解析还原成原来的对象,如想提取成工具

* 类,不管server端传递的是什么对象,client仅仅需知道对象类型就能够解析。因此在此使用泛型T

* @return

*/

public static T getperson(String jsonstring, Class cls) {

T t = null;

Gson gson = new Gson();

t = gson.fromJson(jsonstring, cls);

return t;

}

/**

* 使用Gson进行解析List对象

* TypeToken 官方提供的反射机制,详见api说明文档

*

*

* @param jsonstring

* @param cls

* @param

* @return

*/

public static List getpersons(String jsonstring, Class cls) {

List list = new ArrayList();

Gson gson = new Gson();

//TypeToken把对象T中属性的值通过反射机制映射出来。再从jsonstring字符串中取出来的值放进去

//TypeToken>(){}.getType()该方法表示把jsonstring字符串里面的值取出来之后封装到list中,然后分别从T中取出全部的类型

list = gson.fromJson(jsonstring, new TypeToken>() {

}.getType());

return list;

}

public static List getList(String jsonString) {

List list = new ArrayList<>();

Gson gson = new Gson();

list = gson.fromJson(jsonString, new TypeToken>() {

}.getType());

return list;

}

public static List> getlistmap(String jsonstring) {

List> list = new ArrayList<>();

Gson gson = new Gson();

list = gson.fromJson(jsonstring, new TypeToken>>() {

}.getType());

return list;

}

}剩下的事情就是我们实现详细的点击事件的功能了,由于这里使用API的版本号不支持在主线程中訪问网络请求,这里为了方便起见,我就直接定义了一个线程进行訪问。在详细的代码实现过程中,大家能够依据须要使用不同的方法:

case R.id.gsonperson:

new Thread(){

@Override

public void run() {

String path5 ="http://192.168.199.247:8080/jsonProject1/JsonAction?

action_flag=person";

String jsonstring = HttpUtils.getJsonContent(path5);

Person person = GsonTools.getperson(jsonstring,Person.class);

Log.i(TAG,person.toString());

}

}.start();

break;

case R.id.gsonpersons:

new Thread(){

@Override

public void run() {

String path6 ="http://192.168.199.247:8080/jsonProject1/JsonAction?action_flag=persons";

String jsonstring = HttpUtils.getJsonContent(path6);

List list = GsonTools.getpersons(jsonstring, Person.class);

Log.i(TAG,list.toString());

}

}.start();

break;

case R.id.gsonliststring:

new Thread(){

@Override

public void run() {

String path7 ="http://192.168.199.247:8080/jsonProject1/JsonAction?action_flag=liststring";

String jsonstring = HttpUtils.getJsonContent(path7);

List list = GsonTools.getList(jsonstring);

Log.i(TAG,list.toString());

}

}.start();

break;

case R.id.gsonlistmap:

new Thread(){

@Override

public void run() {

String path8 ="http://192.168.199.247:8080/jsonProject1/JsonAction?

action_flag=listmap";

String jsonstring = HttpUtils.getJsonContent(path8);

List> list =GsonTools.getlistmap(jsonstring);

Log.i(TAG,list.toString());

}

}.start();

break;

}这里仅仅是将关键代码写出,其余代码,能够自己补充!

谢谢大家。请尊重作者的劳动成果。如需转载,请附上转载链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值