热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发实践解析XML和JSON格式的数据

转载请注明出处:http:blog.csdn.netsmartbetterarticledetails51563677上一篇介绍了Android网络通信中的HttpU

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/51563677

上一篇介绍了 Android 网络通信中的 HttpUrlConnection 和 OkHttp 的使用方法,相信大家都能很轻松的实现网络上的GET请求和POST请求了,本篇将进一步扩展网络通信中传输的数据格式的相关内容。目前在网络上传输数据最常用的就是 XML 和 JSON。

1.解析XML格式的数据

这里提供一段XML格式的数据用于解析:

<items>
<item>
<id>1id>
<name>zhangsanname>
<age>20age>
item>
<item>
<id>2id>
<name>lisiname>
<age>25age>
item>
items>

解析XML格式的数据有很多方式,这里重点介绍 Pull解析 和 SAX解析:

1.Pull解析方式

/**
* @param xmlData XML格式数据
*/

private void parseXMLWithPull (String xmlData) {
try {
String id = "";
String name = "";
String age = "";
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
// 开始解析某个节点
case XmlPullParser.START_TAG:
if ("id".equals(nodeName)) {
id = xmlPullParser.nextText();
} else if ("name".equals(nodeName)) {
name = xmlPullParser.nextText();
} else if ("age".equals(nodeName)) {
age = xmlPullParser.nextText();
}
break;
// 完成解析某个节点
case XmlPullParser.END_TAG:
if ("item".equals(nodeName)) {
Log.i("JAVA", "id:"+id+",name:"+name+",age:"+age);
}
break;
default:
break;
}
eventType = xmlPullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

2.SAX解析方式

/**
* @param xmlData XML格式数据
*/

private void parseXMLWithSAX (String xmlData) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
xmlReader.setContentHandler(handler); // 将ContentHandler的实例设置到XMLReader中
xmlReader.parse(new InputSource(new StringReader(xmlData))); // 开始执行解析
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

class ContentHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id, name, age;
// XML解析的时候调用
@Override
public void startDocument() throws SAXException {
id = new StringBuilder();
name = new StringBuilder();
age = new StringBuilder();
}
// 开始解析某个节点的时候调用
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
nodeName = localName;
}
// 获取节点中内容的时候调用
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if ("id".equals(nodeName)) {
id.append(ch, start, length);
} else if ("name".equals(nodeName)) {
name.append(ch, start, length);
} else if ("age".equals(nodeName)) {
age.append(ch, start, length);
}
}
// 完成解析某个节点的时候调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("item".equals(localName)) {
Log.i("JAVA", "id:"+id.toString().trim()+",name:"+name.toString().trim()
+",age:"+age.toString().trim());
id.setLength(0); // 最后将StringBuilder清空
name.setLength(0);
age.setLength(0);
}
}
// 完成整个XML解析的时候调用
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}

2.解析JSON格式的数据

比起XML,JSON的主要优势在于它的体积更小,在网络上传输时可以更省流量。

这里提供一段JSON格式的数据用于解析:

[{"id":"1","name":"zhangsan","age":"20"},
{"id":"2","name":"lisi","age":"25"},
{"id":"3","name":"wangwu","age":"22"}]

解析JSON数据也有很多种方法,可以使用原生的JSONObject,也可以使用Google的开源库GSON,另外还有一些第三方开源库,比如Jackson、FastJSON等也非常不错。

1.JSONObject解析方式

/**
* @param jsonData JSON格式数据
*/

private void parseJSONWithJSONObject (String jsonData) {
try {
JSONArray jsOnArray= new JSONArray(jsonData);
for (int i=0; i JSONObject jsOnObject= jsonArray.getJSONObject(i);
Log.i("JAVA", "id:"+jsonObject.getString("id")+",name:"+jsonObject.getString("name")
+",age:"+jsonObject.getString("age"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}

2.使用GSON解析

使用GSON解析需要添加Gradle依赖(https://github.com/google/gson):

compile 'com.google.code.gson:gson:2.8.0'

这里我们先新建实体类(Jackson、FastJSON也会用到这个实体类):

public class ItemBean {
private int id;
private String name;
private int age;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}

下面看一下如何使用GSON进行解析:

/**
* @param jsonData JSON格式数据
*/

private void parseJSONWithGSON (String jsonData) {
Gson gson = new Gson();
List itemList = gson.fromJson(jsonData, new TypeToken>(){}.getType());
for (ItemBean itemBean : itemList) {
Log.i("JAVA", "id:"+itemBean.getId()+",name:"+itemBean.getName()+",age:"+itemBean.getAge());
}
}

3.使用Jackson解析

Jackson在线文档 Jackson官网的翻译 Jackson源码查看

使用Jackson解析需要添加Gradle依赖(https://github.com/FasterXML/jackson):

compile 'com.fasterxml.jackson.core:jackson-databind:2.9.0.pr2'

下面看一下如何使用Jackson进行解析:

/**
* @param jsonData JSON格式数据
*/

private void parseJSONWithFastJackson (String jsonData) {
try {
ObjectMapper objectMapper = new ObjectMapper();
List itemList = objectMapper.readValue(jsonData,
new TypeReference>(){});
Log.i("JAVA", itemList.toString());
for (ItemBean itemBean : itemList) {
Log.i("JAVA", "id:"+itemBean.getId()+",name:"+itemBean.getName()+",age:"+itemBean.getAge());
}
} catch (IOException e) {
e.printStackTrace();
}
}

4.使用FastJSON解析

使用FastJSON解析也需要添加Gradle依赖(https://github.com/alibaba/fastjson):

compile 'com.alibaba:fastjson:1.2.28'

下面看一下如何使用FastJSON进行解析:

/**
* @param jsonData JSON格式数据
*/

private void parseJSONWithFastJSON (String jsonData) {
List itemList = JSON.parseArray(jsonData, ItemBean.class);
for (ItemBean itemBean : itemList) {
Log.i("JAVA", "id:"+itemBean.getId()+",name:"+itemBean.getName()+",age:"+itemBean.getAge());
}
}

推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
author-avatar
hqgj15087878726
缅甸环球国际开户:15087878726游戏网址:www.6662016.com
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有