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>

结果如图

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

原文地址:https://www.cnblogs.com/rebirther/p/12888087.html