zoukankan      html  css  js  c++  java
  • Android之JSON解析

    编写项目,包含一个Activity。Activity页面效果如下图所示。点击按钮“解析文件1”后解析Json文件json_single并将结果显示在红色框体中,点击按钮“解析文件2”后解析Json文件json_multiple并将结果显示在红色框体中(有多条数据,建议使用列表控件ListView进行信息展示)。

     先写xml布局文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical">
     6 
     7     <Button
     8         android:id="@+id/button50"
     9         android:layout_width="match_parent"
    10         android:layout_height="wrap_content"
    11 
    12         android:text="解析文件1" />
    13     <Button
    14         android:id="@+id/button51"
    15         android:layout_width="match_parent"
    16         android:layout_height="wrap_content"
    17         android:text="解析文件2" />
    18     <ListView
    19         android:layout_width="match_parent"
    20         android:layout_height="wrap_content"
    21         android:id="@+id/LS"/>
    22 </LinearLayout>

    将我们的JSON文件导入到res的raw下,如果没有raw,右键Andrriod Resource Directory在Resource type中输入raw,ok

    json_single.json :

    1 {
    2     "name":"王小二",
    3     "age":25,
    4     "birthday":"1990-01-01",
    5     "school":"师大",
    6     "car":"比亚迪",
    7     "house":"宿舍",
    8 }

    json_multiple.json :

     1 [{
     2     "name":"王小二",
     3     "age":25,
     4     "birthday":"1990-01-01",
     5     "school":"师大",
     6     "car":"比亚迪",
     7     "house":"宿舍",
     8 },
     9 {
    10     "name":"李三",
    11     "age":30,
    12     "birthday":"1987-04-13",
    13     "school":"清华",
    14     "car":"大众速腾",
    15     "house":"公寓",
    16 },
    17 {
    18     "name":"张盼盼",
    19     "age":17,
    20     "birthday":"1995-07-02",
    21     "school":"北大",
    22     "car":"宝马7系",
    23     "house":"别墅",
    24 }]

    思路很简单,就是读取到json文件然后解析最后显示出来。

    Mainactiviyt : 

      1 package com.example.app;
      2 
      3 import androidx.annotation.RequiresApi;
      4 import androidx.appcompat.app.AppCompatActivity;
      5 
      6 import android.Manifest;
      7 import android.annotation.SuppressLint;
      8 import android.os.Build;
      9 import android.os.Bundle;
     10 import android.view.View;
     11 import android.view.ViewGroup;
     12 import android.view.LayoutInflater;
     13 
     14 import android.widget.*;
     15 import org.json.*;
     16 import org.json.JSONException;
     17 import org.json.JSONObject;
     18 import java.io.BufferedReader;
     19 import java.io.FileOutputStream;
     20 import java.io.FileInputStream;
     21 import java.io.IOException;
     22 import java.io.InputStream;
     23 import java.io.InputStreamReader;
     24 import java.security.Permission;
     25 import java.security.Permissions;
     26 import java.io.UnsupportedEncodingException;
     27 
     28 
     29 public class MainActivity extends AppCompatActivity {
     30 
     31     private static String[] Json; //用来存储的数组
     32     private ListView LS;
     33     private Button B1;
     34     private Button B2;
     35     private int a = 0;
     36 
     37     @Override
     38     protected void onCreate(Bundle savedInstanceState) {
     39         super.onCreate(savedInstanceState);
     40         setContentView(R.layout.homework_8_2);
     41 
     42         B1 = (Button) findViewById(R.id.button50);
     43         B2 = (Button) findViewById(R.id.button51);
     44         LS = (ListView) findViewById(R.id.LS); //实例化按钮B1,B2,和listview
     45         B1.setOnClickListener(new View.OnClickListener() {//监听B1
     46             @Override
     47             public void onClick(View v) {
     48                 //Json = new String[100];
     49                 JsonDataToString1(); //读取json文件
     50             }
     51         });
     52         B2.setOnClickListener(new View.OnClickListener() {//监听B2
     53             @Override
     54             public void onClick(View v) {
     55                 //Json = new String[100];
     56                 a = 0; //当B2被点击,变量a就会重置为0
     57                 JsonDataToString2(); //读取json文件
     58             }
     59         });
     60     }
     61     @SuppressLint("ResourceType")
     62     private void JsonDataToString1(){
     63 
     64         InputStreamReader inputStreamReader = null;
     65         String jsonData = "";
     66         try {
     67             inputStreamReader = new InputStreamReader(getResources().openRawResource(R.raw.json_single),"UTF-8");//读取
     68             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
     69             String line;
     70             StringBuilder srt = new StringBuilder();
     71             while((line = bufferedReader.readLine()) != null){
     72                 srt.append(line);
     73             }
     74             inputStreamReader.close();
     75             bufferedReader.close();
     76             jsonData = srt.toString(); //以上就是读取json文件,转化成string
     77         }catch (UnsupportedOperationException e){
     78             e.printStackTrace();
     79         }catch (IOException e){
     80             e.printStackTrace();
     81         }
     82 
     83         if (jsonData != ""){
     84             getDataFromData1(jsonData); //进一步分析字符串,获取json内容
     85         }else {
     86             Toast.makeText(MainActivity.this,"error",Toast.LENGTH_SHORT).show();
     87         }
     88         }
     89 
     90         private void getDataFromData1(String jsonData){
     91         try{
     92 
     93             JSONObject jsonObject = new JSONObject(jsonData);
     94             String name = jsonObject.getString("name");
     95             String age = jsonObject.getString("age");
     96             String birthday = jsonObject.getString("birthday");
     97             String school = jsonObject.getString("school");
     98             String car = jsonObject.getString("car");
     99             String house = jsonObject.getString("house"); //获取json内容
    100             Json = new String[]{
    101                     "name:"+name,"age:"+age,"birthday:"+birthday,"school:"+school,"car:"+car,"house:"+house
    102             };//将json内容存进数组中
    103             ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,R.id.LS);//新建并配置ArrayAapeter
    104             MyBaseAdapter mAdapter = new MyBaseAdapter();
    105             LS.setAdapter(mAdapter);
    106         }catch (JSONException e){
    107             e.printStackTrace();
    108         }
    109         }
    110 
    111     @SuppressLint("ResourceType")
    112     private void JsonDataToString2(){
    113 
    114         InputStreamReader inputStreamReader = null;
    115         String jsonData = "";
    116         try {
    117             inputStreamReader = new InputStreamReader(getResources().openRawResource(R.raw.json_multiple),"UTF-8");//读取
    118             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    119             String line;
    120             StringBuilder srt = new StringBuilder();
    121             while((line = bufferedReader.readLine()) != null){
    122                 srt.append(line);
    123             }
    124             inputStreamReader.close();
    125             bufferedReader.close();
    126             jsonData = srt.toString();//以上就是读取json文件,转化成string
    127         }catch (UnsupportedOperationException e){
    128             e.printStackTrace();
    129         }catch (IOException e){
    130             e.printStackTrace();
    131         }
    132 
    133         if (jsonData != ""){
    134             getDataFromData2(jsonData); //进一步分析字符串,获取json内容
    135         }else {
    136             Toast.makeText(MainActivity.this,"error",Toast.LENGTH_SHORT).show();
    137         }
    138     }
    139 
    140     private void getDataFromData2(String jsonData){
    141         try{
    142             Json = new String[100]; //这里必须初始化Json数组,否则点击完解析一后Json数组的length只有6,会因空间不足而程序崩溃
    143             JSONArray jsonArray = new JSONArray(jsonData);
    144             //String[] bbk = new String[]{};
    145             for (int i=0;i<jsonArray.length();i++){ //会循环三次
    146                 JSONObject jsonObject = jsonArray.getJSONObject(i);
    147                 String name = jsonObject.getString("name");
    148                 String age = jsonObject.getString("age");
    149                 String birthday = jsonObject.getString("birthday");
    150                 String school = jsonObject.getString("school");
    151                 String car = jsonObject.getString("car");
    152                 String house = jsonObject.getString("house");//解析出json的内容
    153                 Json[a] = "name:"+name;  //为了将数据循环存储进Json数组中,用了一个变量a来控制
    154                 Json[a+1] = "age:"+age;
    155                 Json[a+2] = "birthday:"+birthday;
    156                 Json[a+3] = "school:"+school;
    157                 Json[a+4] = "car:"+car;
    158                 Json[a+5] = "house:"+house; //因为发现数据有六项且key值都一样,就正好用一个变量a来表示数组的下标
    159                 a = a+6;  //如果a不重置为0,那么a会不停的往上加,直到超出数组下标溢出,导致程序崩溃
    160             }
    161             ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,R.id.LS);//新建并配置ArrayAapeter
    162             MyBaseAdapter mAdapter = new MyBaseAdapter();
    163             LS.setAdapter(mAdapter);
    164         }catch (JSONException e){
    165             e.printStackTrace();
    166         }
    167     }
    168 
    169     class MyBaseAdapter extends BaseAdapter{ //这里不解释
    170 
    171         @Override
    172         public int getCount() {
    173             return Json.length;
    174         }
    175         @Override
    176         public Object getItem(int position) {
    177             return null;
    178         }
    179         @Override
    180         public long getItemId(int position) {
    181             return 0;
    182         }
    183         @Override
    184         public View getView(int position, View convertView, ViewGroup parent) {
    185             ViewHolder holder;
    186             if(convertView == null){
    187                 convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.homework_five_2,parent,false);
    188                 holder = new ViewHolder();
    189                 holder.mTextView = (TextView) convertView.findViewById(R.id.tv);
    190                 convertView.setTag(holder);
    191             }else {
    192                 holder = (ViewHolder) convertView.getTag();
    193             }
    194             holder.mTextView.setText(Json[position]);
    195             return convertView;
    196         }
    197         class ViewHolder {
    198             TextView mTextView;
    199         }
    200     }
    201 
    202 }

    我们的布局文件用的listview,所以我们需要再写一个布局文件提供格式

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     xmlns:app="http://schemas.android.com/apk/res-auto"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent">
     6 
     7     <TextView
     8         android:id="@+id/tv"
     9         android:layout_width="match_parent"
    10         android:layout_height="match_parent"/>
    11 
    12 </LinearLayout>

    结果如图

    最后,赶时间写出来的,写的很烂,等过几天精简一下代码,等待更新哦!

  • 相关阅读:
    软件测试作业随笔之二:Homework 2
    软件项目管理作业随笔之一:记我完成的一个项目
    C#博客随笔之十:Problem Statement+System Glossary+System Supplementary Specification FOR每美欲下
    C#博客随笔之九:EF框架的使用
    C#博客随笔之八:EntityFramework初识
    C#博客随笔之七:反射初体验
    C#博客随笔之六:数据绑定
    node.js 框架基本功能
    为什么不用第三方缓存
    微服务基础设施实现方案 -- node.js
  • 原文地址:https://www.cnblogs.com/rebirther/p/12888087.html
Copyright © 2011-2022 走看看