Android json解析有关内容学习笔记

17 篇文章 0 订阅

http://www.2cto.com/kf/201301/185026.html 

 

毋庸置疑,Json是当下最主流最受欢迎的数据交换格式,得益于json的简单易用,一直没有系统的学习有关json的知识,总是一知半解,所以想整理一下json相关的学习内容。文档中指出,json是一种轻量级的具有良好的可读性和便于快速编写的的交换格式,获得当今大多数语言的支持,可在不同平台上进行数据交换,比较理想,正因为其种种优良特性使得其很快取代了xml。

       所有的json相关资料习惯性的都会列出json和xml的对比,那好我也copy过来
优点:
      比xml格式简单; 
      json是更好的数据交换格式;xml是更好的文档交换格式; 
      json更易于机器阅读,使用简单的客户端库或者自身支持(javascript); 
      json可被浏览器客户端支持; 
      可支持各种通用的数据结构,记录、列表、树; 
      21种语言支持可解析和生成json格式 
缺点:
      没有xml中类似CDATA的特性,不适合传递声音和图片等二进制数据; 
      json不具备显示能力,和xml相比; 
      json不可扩展,和xml相比。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
       前段时间看阮一峰的博客,一篇写到有关数据类型和json的内容,觉得说的非常好,把一些概念性的东西通俗易懂的讲了出来,很容易理解,内容如下:
    从结构上看,所有的数据最终都可以分解成三种类型:
       第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词。
       第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海"。
       第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比    如"首都:北京"。
        数据构成的最小单位原来如此简单!难怪在 编程语言中,只要有了数组(array)和对象(object)就能够储存一切数据了。
   Json的规格非常简单,只用一个页面几百个字就能说清楚,而且这个规格永远不必升级,因为该规定的都规定了。
  1) 并列的数据之间用逗号(",")分隔。
  2) 映射用冒号(":")表示。
  3) 并列数据的集合(数组)用方括号("[]")表示。
  4) 映射的集合(对象)用大括号("{}")表示。
      上面四条规则,就是Json格式的所有内容。
 
-----------------------------------------------------------------------------------------------------------------------------------------------------------------      
       看过一些介绍android json参考资料后,打算自己动手尝试去写写解析json的例子,在代码中遇到的问题才会印象更深刻,将两个demo集合在一起,两个解析的方式都是相同的,只是构建json的时候不同而已:一种是在tomcat上放置一个 jsp文件,里面用json的格式描述的一些列字符串,然后去解析还原出来;另一种是在代码中构建json格式之后再进行解析,下面PO的是主要一些代码:
放在tomcat上的jsp文件json.jsp,按照json的格式描述的一段字符串:
[javascript]  
<%@ page contentType="text/ html;charset=GBK"%>  
{"Race" : "侏儒", "Name" : "辛德瑞拉嘟嘟", "Profession" : "法师",  
 "Server" :{"Server_region":"二区","Server_name":"阿古斯"},   
 "Talent" : ["奥术","火焰"], "Achievement_Point" : 12090,   
 "P_Skill" : ["工程学","附魔"], "L_Skill" : ["急救","烹饪","考古学","钓鱼"],  
  "Profession" : "法师" }  
 
自己封装一个用于解析的HttpUtil:
[java]  
package com.eyu.json;  
  
import java.io.IOException;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.Map;  
  
import org.apache.http.HttpResponse;  
import org.apache.http.NameValuePair;  
import org.apache.http.ParseException;  
import org.apache.http.client.ClientProtocolException;  
import org.apache.http.client.HttpClient;  
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.client.methods.HttpPost;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.apache.http.message.BasicNameValuePair;  
import org.apache.http.util.EntityUtils;  
  
public class HttpUtil {  
    public static HttpClient httpClient = new DefaultHttpClient();  
      
    public static String getRequest(String url) throws ParseException, IOException{  
        //创建httpGet对象  
        HttpGet httpGet = new HttpGet(url);  
        //发送Get请求  
        HttpResponse httpResponse = httpClient.execute(httpGet);  
        //如果服务器成功的返回响应  
        if(httpResponse.getStatusLine().getStatusCode()==200){  
            //获取服务器响应字符串  
            String result = EntityUtils.toString(httpResponse.getEntity());  
            return result;  
        }  
        return null;  
    }  
  
      
      
    public static String postRequest(String url,Map<String,String> rawParams) throws ClientProtocolException, IOException{  
        //创建httpPost对象  
        HttpPost httpPost = new HttpPost(url);  
        //如果传递参数比较多,可以对传递的参数进行封装  
        List<NameValuePair> params = new ArrayList<NameValuePair>();  
        for(String key : rawParams.keySet()){  
            //封装请求参数  
            params.add(new BasicNameValuePair(key, rawParams.get(key)));  
        }  
          
        //发送post请求  
        HttpResponse httpResponse = httpClient.execute(httpPost);  
        //如果服务器成功的返回响应  
        if(httpResponse.getStatusLine().getStatusCode()==200){  
            //获取服务器响应字符串  
            String result = EntityUtils.toString(httpResponse.getEntity());  
            return result;  
        }  
          
        return null;  
    }  
}  
 
之后便可以在activity中进行解析的操作了:
[java]  
...............  
String result = null;  
        try {  
            result = HttpUtil.getRequest("http://10.0.2.2:8080/jsontest/json.jsp");  
            Log.i("PDA", "result-------->" + result);  
        } catch (Exception e) {e.printStackTrace();}  
          
        JSONObject jsonObject = new JSONObject(result);  
        txt_Name = (TextView) findViewById(R.id.txt_Name);  
        txt_Name.setText(jsonObject.getString("Name"));  
          
        txt_Race = (TextView) findViewById(R.id.txt_Race);  
        txt_Race.setText(jsonObject.getString("Race"));  
          
        txt_Profession = (TextView) findViewById(R.id.txt_Profession);  
        txt_Profession.setText(jsonObject.getString("Profession"));  
          
        txt_ServerMsg = (TextView) findViewById(R.id.txt_ServerMsg);  
        txt_ServerMsg.setText(jsonObject.getJSONObject("Server").getString("Server_region")+","+jsonObject.getJSONObject("Server").getString("Server_name"));  
          
        txt_Talent = (TextView) findViewById(R.id.txt_Talent);  
        txt_Talent.setText(jsonObject.getJSONArray("Talent").getString(0)+","+jsonObject.getJSONArray("Talent").getString(1));  
............................  
 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
 另外一种是直接构建json对象:
[java] 
//创建一个json对象  
            jsonObject = new JSONObject();  
  
            //字符串值放入jsonObject中  
            jsonObject.put("Name", "辛德瑞拉点点");  
            jsonObject.put("Race", "人类");  
            jsonObject.put("Profession", "死亡骑士");  
              
            //服务器的信息的值是对象,故创建一个对象,然后添加到jsonObject对象中  
            JSONObject serverMsg = new JSONObject();  
            serverMsg.put("Server_region", "二区");  
            serverMsg.put("Server_name", "阿古斯");  
            jsonObject.put("Server", serverMsg);  
  
            //天赋信息的值是数组,故创建一个数组,然后添加到jsonObject对象中  
            JSONArray talent = new JSONArray();  
            talent.put("鲜血").put("冰霜");  
            jsonObject.put("Talent", talent);  
  
            //整数值放入jsonObject中  
            jsonObject.put("Achievement_Point", 12090);  
...............................  
之后的解析方式是一样的。
以下是解析之后的效果图:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值