• 转:Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显示在客户端上面】)


    转自:http://blog.csdn.net/jiangqq781931404/article/details/7289882

    前面学习过了使用SAX解析XML数据(点击进入:SAX解析XML数据),今天学习Json解析;

          首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Json数据的体积更加小,传输效率高,易解析,不过可读性不高;

          因为这次要从服务器端得到Json数据,并且通过解析之后把解析后的数据显示在Android客户端中,首先部署服务器端代码(直接使用Jsp/Servlet):

           构造的Json数据如下:

         [{"name":"张三","address":"北京","age":20},{"name":"李四","address":"上海","age":30},{"name":"王五","address":"深圳","age":35}]

     

    [一]服务器端(Person.java省略):

         ①:数据构造JsonService.java

    1. <SPAN style="FONT-SIZE: 16px">public class JsonService {  
    2.     public static List<Person> getListPerson() {  
    3.         List<Person> mLists = new ArrayList<Person>();  
    4.         mLists.add(new Person("张三""北京"20));  
    5.         mLists.add(new Person("李四""上海"30));  
    6.         mLists.add(new Person("王五""深圳"35));  
    7.         return mLists;  
    8.     }</SPAN>  

        ②:Servlet的代码(包括构造Json数据,没有使用Json数据转换方法)JsonServlet.java

    1. <SPAN style="FONT-SIZE: 16px">public void doGet(HttpServletRequest request, HttpServletResponse response)  
    2.             throws ServletException, IOException {  
    3.         response.setContentType("text/html");  
    4.         response.setCharacterEncoding("UTF-8");  
    5.         PrintWriter out = response.getWriter();  
    6.         List<Person> persons = JsonService.getListPerson();  
    7.         StringBuffer sb = new StringBuffer();  
    8.         sb.append('[');  
    9.         for (Person person : persons) {  
    10.             sb.append('{').append("\"name\":").append("\""+person.getName()+"\"").append(  
    11.                     ",");  
    12.             sb.append("\"address\":").append("\""+person.getAddress()+"\"").append(",");  
    13.             sb.append("\"age\":").append(person.getAge());  
    14.             sb.append('}').append(",");  
    15.         }  
    16.         sb.deleteCharAt(sb.length() - 1);  
    17.         sb.append(']');  
    18.         out.write(new String(sb));  
    19.         out.flush();  
    20.         out.close();  
    21.     }</SPAN>  
    1. <SPAN style="FONT-SIZE: 16px">  
    2. </SPAN>  
    
    

             ③:部署到Tomact 浏览器输入http://localhost/JsonWeb/JsonServlet直接访问结果如下:

           至此服务器端代码编码完成,下面进行客户端代码编写;

      

      (二)客户端(Person类,和展示数据的布局文件因为简单省去)

     

          ①:获取服务器端的Json数据并且解析的工具类JsonParse.java

     

      必要的需要导入的包省去   

    1. <SPAN style="FONT-SIZE: 18px">public class JsonParse {  
    2.     /** 
    3.      * 解析Json数据 
    4.      *  
    5.      * @param urlPath 
    6.      * @return mlists 
    7.      * @throws Exception 
    8.      */  
    9.     public static List<Person> getListPerson(String urlPath) throws Exception {  
    10.         List<Person> mlists = new ArrayList<Person>();  
    11.         byte[] data = readParse(urlPath);  
    12.         JSONArray array = new JSONArray(new String(data));  
    13.         for (int i = 0; i < array.length(); i++) {  
    14.             JSONObject item = array.getJSONObject(i);  
    15.             String name = item.getString("name");  
    16.             String address = item.getString("address");  
    17.             int age = item.getInt("age");  
    18.             mlists.add(new Person(name, address, age));  
    19.         }  
    20.         return mlists;  
    21.     }  
    22.     /** 
    23.      * 从指定的url中获取字节数组 
    24.      *  
    25.      * @param urlPath 
    26.      * @return 字节数组 
    27.      * @throws Exception 
    28.      */  
    29.     public static byte[] readParse(String urlPath) throws Exception {  
    30.         ByteArrayOutputStream outStream = new ByteArrayOutputStream();  
    31.         byte[] data = new byte[1024];  
    32.         int len = 0;  
    33.         URL url = new URL(urlPath);  
    34.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
    35.         InputStream inStream = conn.getInputStream();  
    36.         while ((len = inStream.read(data)) != -1) {  
    37.             outStream.write(data, 0, len);  
    38.         }  
    39.         inStream.close();  
    40.         return outStream.toByteArray();  
    41.     }  
    42. }</SPAN>  

        ②:主Activity类

    1. <PRE class=java name="code">public class MainActivity extends Activity {  
    2.     private Button mButton;  
    3.     private ListView mListView;  
    4.     //使用IP不能使用localhost或者127.0.0.1,因为android模拟器默认绑定这个IP,这里应该访问局域网IP   
    5.     private static final String urlPath = "http://10.16.31.207/JsonWeb/JsonServlet";  
    6.     private static final String TAG = "MainActivity";  
    7.     private List<Person> persons;  
    8.     @Override  
    9.     public void onCreate(Bundle savedInstanceState) {  
    10.         super.onCreate(savedInstanceState);  
    11.         setContentView(R.layout.main);  
    12.         mButton = (Button) findViewById(R.id.button1);  
    13.         mListView = (ListView) findViewById(R.id.listView1);  
    14.         mButton.setOnClickListener(new MyOnClickListener());  
    15.     }  
    16.   
    17.     private class MyOnClickListener implements OnClickListener {  
    18.         @Override  
    19.         public void onClick(View v) {  
    20.             try {  
    21.                 // 得到Json解析成功之后数据   
    22.                 persons = JsonParse.getListPerson(urlPath);  
    23.                 List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();  
    24.                 for (int i = 0; i < persons.size(); i++) {  
    25.                     HashMap<String, Object> map = new HashMap<String, Object>();  
    26.                     map.put("name", persons.get(i).getName());  
    27.                     map.put("address", persons.get(i).getAddress());  
    28.                     map.put("age", persons.get(i).getAge());  
    29.                     data.add(map);  
    30.                 }  
    31.                 //初始化适配器,并且绑定数据   
    32.                 SimpleAdapter _Adapter = new SimpleAdapter(MainActivity.this,  
    33.                         data, R.layout.listview_item, new String[] { "name",  
    34.                                 "address""age" }, new int[] { R.id.textView1,  
    35.                                 R.id.textView2, R.id.textView3 });  
    36.                 mListView.setAdapter(_Adapter);  
    37.             } catch (Exception e) {  
    38.                 Toast.makeText(MainActivity.this"解析失败"2000).show();  
    39.                 Log.i(TAG, e.toString());  
    40.   
    41.             }  
    42.         }  
    43.     }</PRE><BR>  
    44. <BR>  
    45. <PRE></PRE>  
    46. <SPAN style="FONT-SIZE: 18px">      </SPAN><SPAN style="COLOR: rgb(51,153,153); FONT-SIZE: 18px">  </SPAN>  
    47. <P></P>  
    48. <P><SPAN style="FONT-SIZE: 18px"><SPAN style="COLOR: #339999"></SPAN></SPAN></P>  
    49. <P><SPAN style="FONT-SIZE: 18px"><SPAN style="COLOR: #339999">   至此服务器端和客户端编码介绍,运行android应用结果截图:</SPAN></SPAN></P>  
    50. <P><SPAN style="FONT-SIZE: 18px"><IMG alt="" src="http://hi.csdn.net/attachment/201202/24/0_1330067381FcfP.gif"></SPAN></P>  
    51. <P></P>  
    52. <P></P>  
    53. <P><SPAN style="FONT-SIZE: 16px">      源代码下载链接:<A href="http://download.csdn.net/detail/jiangqq781931404/4087194">http://download.csdn.net/detail/jiangqq781931404/4087194</A></SPAN></P>  
    54. <P></P>  
    55. <P></P>  
    56. <P><SPAN style="FONT-SIZE: 18px"></SPAN></P>  
    57. <P><SPAN style="FONT-SIZE: 18px"></SPAN></P>  
    58. <PRE></PRE>  
    59. <PRE></PRE>  
  • 相关阅读:
    联想Thinkpad L460安装Win7 64位
    2019牛客暑期多校训练营(第六场)E 构造、原图是补图的同构图
    网络流24题 P2766 最长不下降子序列问题
    The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest B、H
    P4781 拉格朗日插值
    P4717 快速沃尔什变换FWT 模板题
    2019CCPC-江西省赛C题 HDU6569 GCD预处理+二分
    Gym 101917 E 简单计算几何,I 最大流
    51 Nod 1238 最小公倍数之和 V3 杜教筛
    51Nod 1237 最大公约数之和 V3 杜教筛
  • 原文地址:https://www.cnblogs.com/qingblog/p/2734927.html
Copyright © 2020-2023  润新知