android中的Json与xml解析对比分析

本文对比分析了Android中Json和XML两种数据交换格式的特性。Json简单且适合表示对象和数组,而XML则用于结构化数据描述。XML解析通常使用DOM(整个读入内存)和SAX(逐步解析)。在Android系统中,Json解析对于小量数据效率较高,而XML的SAX解析适用于大量数据场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Json 、XML 两种数据交换格式:

Json简单的说就是Javascript的对象和数组

  1.对象:对象在Js中表示为“{}”括起来的内容

  2.数组:数组是在Js中是中括号“[ ]”括起来的内容

例:{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"-7","WD":"西南风","WS":"2级","SD":"42%","WSE":"2","time":"17:45","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB"}}


XML 可扩展标志语言(Extensible Makeup Language)

XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据,

Xml与Access等数据库不同,XML只提供数据的存储,而数据库功能更强大,有查询。排序等功能

XMl和HTML设计区别:XML的核心是数据,是数据成对出现,而HTML重点是数据的显示,数据不用成对出现,

不区分大小写,而XML是区分大小写的。

例:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="001">
<name>张三</name>
<age>22</age>
</person>
</persons>

XML目前设计了两种解析方式:DOM和SAX;

DOM是把一个数据交换格式XML看成一个DOM对象,需要把XML文件整个读入内存,

这一点上JSON和XML的原理是一样的,但是XML要考虑父节点和子节点,这一点上JSON的解析难度要小很多,

因为JSON构建于两种结构:key/value,键值对的集合;值的有序集合,可理解为数组;

SAX不需要整个读入文档就可以对解析出的内容进行处理,是一种逐步解析的方法。程序也可以随时终止解析。

这样,一个大的文档就可以逐步的、一点一点的展现出来,所以SAX适合于大规模的解析。

这一点,JSON目前是做不到得。


下面通过两个实例,对比分析android系统中对两种数据交换格式的解析过程:

Json 主代码如下:
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;


public class Json {

public String weather_temp1;
public String weather_weather1;
public String weather_wind1;
public String weather_index_d;
public String weather_date_y;
    //城市名称与城市编号相对应的数组 
    private String[] city={"深圳","101280601","广州","101280101","北京","101010100",
                          "桂林","101300501","全州","101300508", "南宁","101300101",
                          "柳州", "101300301","东莞","101281601","珠海","101280701",
                          "香港","101320101","澳门","101330101","台湾","101340101","钓鱼岛","101231001"};
    
    private String city_code="101280601";
public String connServerForResult(String strCity) {
              
                  //通过传入的城市名字,转换成相应的城市编号,默认的为深圳
                for( int i=0;i<city.length;)
                   {
                     if(city[i].equals(strCity))
                      {
                     city_code=city[i+1];
                      break;
                      }
                else
                     {
                    i+=2;
                     }
                       }
               //通过城市编号,获得相应城市的天气预报的Url
String strUrl="http://m.weather.com.cn/data/"+city_code+".html";
              //通过HttpGet类获取Json数据,具体用法见 http://blog.youkuaiyun.com/txj8612/article/details/8233667
HttpGet httpRequest=new HttpGet(strUrl);
String strResult="";
HttpClient httpClient=new DefaultHttpClient();
try {
HttpResponse httpResponse=httpClient.execute(httpRequest);
if(httpResponse.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
strResult=EntityUtils.toString(httpResponse.getEntity());
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return strResult;
}
       //解析json数据,
       //strResult对应的字符串形式为{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"-6","WD":"东风",
      //"WS":"2级","SD":"45%","WSE":"2","time":"12:45","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB"}}
public void parseJson(String strResult){
try {
 //JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值
 //在Key和Value之间是以冒号":"分隔。Value的类型包括:Boolean、JSONArray、JSONObject、Number、String
JSONObject jsonObject=new JSONObject(strResult).getJSONObject("weatherinfo");
weather_temp1=jsonObject.getString("temp1");
weather_weather1=jsonObject.getString("weather1");
weather_wind1=jsonObject.getString("wind1");
weather_index_d=jsonObject.getString("index_d");
weather_date_y=jsonObject.getString("date_y");
}
 catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


XML解析核心代码如下:以sax解析为例


saxparcehandler fresehandler=new saxparsehandler(); //saxparsehandler 是继承DefaultHandler()类

SAXParserFactory factory=SAXParserFactory.newInstance();//创建sax解析器工厂
SAXParser parser = factory.newSAXParser();     //创建sax解析器 

XMLReader xmlReader = parser.getXMLReader();   //创建xmlReader对象,XML解析器

 //为xml解析器设置处理器,处理器才是真正干活的,每个键值的解析都是在处理器里面完成

xmlReader.setContentHandler(fresehandler);    
xmlReader.parse(new InputSource(getResources().openRawResource(R.raw.rss))); //开始解析


//解析文件如下,即:R.raw.rss

<persons>
<person id="001">
<name>张三</name>
<age>22</age>
</person>
<person id="002">
<name>李四</name>
<age>23</age>
</person>
<person id="003">
<name>王五</name>
<age>24</age>
</person>

</persons>


public class saxparsehandler extends DefaultHandler{
public void startDocument() {  //文档解析开始时调用,整个解析的过程之调用一次
System.out.println("startDocument");
}
@Override
public void endDocument() throws SAXException {
System.out.println("endDocument");
super.endDocument();// 文档解析结束时调用,整个解析的过程之调用一次
}
 @Override

 //数据的解析工作主要由startElement这个方法完成,每个节点的解析都会调用此方法一次

public void startElement(String uri, String localName, String qName,
                                       Attributes attributes){ 
                                          System.out.println("startElement");
                                          System.out.println(localName);
                                         System.out.println(qName);
                                        System.out.println(uri);
                               for (int i = 0; i < attributes.getLength(); i++) 
                                      { 
                                       // 获取属性名称 
                                      System.out.println("属性名称:" + attributes.getQName(i)); 
                                       // 获取属性值 
                                      System.out.println("属性值:" 
                                      + attributes.getValue(attributes.getQName(i))); 
                                   }

                            }

public void characters(char[] ch, int start, int length){

                            //这个是继startElement方法后的执行方法。

                           //该方法中的ch把所解析的xml的所有数据都保存进来,且ch初始化为2K数据。       

     }

public void endElement (String uri, String localName, String qName) {  

        //结束解析节点  
    } 

}

Json提供的整体的解析方案,解析小量数据时会有好的效果,而XMl采用逐步解析方法,适用的大量数据的解析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值