Android中JSON的解析-JSONObject和JSONArray
来源:互联网 发布:如何把企业淘宝做好 编辑:程序博客网 时间:2024/04/27 23:56
JSON解析
无可奈何花落去,似曾相识燕归来 – 晏殊
- JSON解析
- JSON语法
- 本地json文件的解析
- 本地的json数据
- 解析实现方法
- 注意
- 网络 json文件的解析
- 网络上的json数据
- 联网权限
- 注意
- JSON文本的编写
- 源码下载
- 参考
JSON语法
json语法是JavaScript对象表示法语法的子集
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保持对象
- 方括号保存数组
JSON的值可以是:
- 数字(整数或者浮点数)
- 字符串(在双引号内)
- 逻辑值(true 或 false)
- 数组(使用方括号[]包围)
- 对象( 使用花括号{}包围)
- null
JSON中有且只有两种结构:对象和数组。
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为
{key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为
对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为
[“java”,”javascript”,”vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
本地json文件的解析
本地的json数据
我们先解析本地的json文件 ,之后再解析网络的json文件
程序要解析的数据都放在项目的assets目录下
我们将新建三个json文件,来依次解析不同的数据类型
下面就三个json文件的源码
注意三个json文件的不同
- get_data1.json
{"name":"baoqiang", "age":"18", "address":"ganzhou"}
- get_data2.json
[ {"id":1,"ide":"Eclipse","name":"java"}, {"id":2,"ide":"XCode","name":"Swift"}, {"id":3,"ide":"Visual Studio","name":"C##"}]
- get_data3.json
{"name":"baoqiang", "age":"18", "address":"ganzhou", "languages":[ {"id":1,"ide":"Eclipse","name":"java"}, {"id":2,"ide":"XCode","name":"Swift"}, {"id":3,"ide":"Visual Studio","name":"C##"} ] }
解析实现方法
一. 解析get_data1.json的数据,代码直接放在onCreate方法下执行
try { //InputStreamReader 将字节输入流转换为字符流 InputStreamReader isr = new InputStreamReader(getAssets().open("get_data1.json"), "UTF-8"); //包装字符流,将字符流放入缓存里 BufferedReader br = new BufferedReader(isr); String line; //StringBuilder和StringBuffer功能类似,存储字符串 StringBuilder builder = new StringBuilder(); while ((line = br.readLine()) != null) { //append 被选元素的结尾(仍然在内部)插入指定内容,缓存的内容依次存放到builder中 builder.append(line); } br.close(); isr.close(); //builder.toString()返回表示此序列中数据的字符串 JSONObject root = new JSONObject(builder.toString()); System.out.println("name= " + root.getString("name") + ";age= " + root.getInt("age") + ";address= " + root.getString("address")); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); }
结果
二. 解析get_data2.json的数据
try { InputStreamReader isr = new InputStreamReader(getAssets().open("get_data2.json"), "UTF-8"); BufferedReader br = new BufferedReader(isr); String line; StringBuilder builder = new StringBuilder(); while ((line = br.readLine()) != null) { builder.append(line); } br.close(); isr.close(); JSONArray array = new JSONArray(builder.toString()); for (int i = 0; i < array.length(); i++) { JSONObject lan = array.getJSONObject(i); System.out.println("-----------------"); System.out.println("id= " + lan.getInt("id")); System.out.println("ide= " + lan.getString("ide")); System.out.println("name= " + lan.getString("name")); } } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); }
结果
三.解析get_data3.json数据
try { InputStreamReader isr = new InputStreamReader(getAssets().open("get_data3.json"), "UTF-8"); BufferedReader br = new BufferedReader(isr); String line; StringBuilder builder = new StringBuilder(); while ((line = br.readLine()) != null) { builder.append(line); } br.close(); isr.close(); JSONObject root = new JSONObject(builder.toString()); System.out.println("name= " + root.getString("name") + " age= " + root.getInt("age") + " address= " + root.getString("address")); //读取多个数据 JSONArray array = root.getJSONArray("languages"); for (int i = 0; i < array.length(); i++) { JSONObject lan = array.getJSONObject(i); System.out.println("-----------------"); System.out.println("id= " + lan.getInt("id")); System.out.println("name= " + lan.getString("name")); System.out.println("ide= " + lan.getString("ide")); } } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); }
结果
注意
lan.getInt(“id”)和getJSONObject();还可以用lan.optInt(“id”)和optJSONObject()表示,功能相同,返回值不同,,get会有null值异常抛出
如果解析数组和对象类型数不正确,则会报错
System.err: org.json.JSONException …….type org.json.JSONObject cannot be converted to JSONArray
System.err: at org.json.JSON.typeMismatch(JSON.java:111)
网络 json文件的解析
网络上的json数据
网络服务器选用Tomcat服务器
我们把get_data3.json文件放在C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\ROOT目录下,并开启Tomcat服务器
大可不必用eclipse建立动态网站来发布文件
下图是开启后从浏览器查看发布的数据
- get_data3.json
{"name":"baoqiang", "age":"18", "address":"ganzhou", "languages":[ {"id":1,"ide":"Eclipse","name":"java"}, {"id":2,"ide":"XCode","name":"Swift"}, {"id":3,"ide":"Visual Studio","name":"C##"} ] }
联网权限
<uses-permission android:name="android.permission.INTERNET"/>
代码
注意
联网需要开子线程,如果要更新UI,还需要在子线程中用runOnUiThread()或者Handler来处理
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("开始"); new Thread() { @Override public void run() { try { //注意填写自己的IPv4路径,不能用localhost String path = "http://192.168.1.44:8080/get_data3.json"; URL url = new URL(path); System.out.println(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); if (conn.getResponseCode() == 200) { System.out.println("连接成功"); InputStream in = conn.getInputStream(); InputStreamReader isr = new InputStreamReader(in); //InputStreamReader isr = new InputStreamReader(getAssets().open("get_data.json"),"UTF-8"); BufferedReader br = new BufferedReader(isr); String line; //StringBuilder 缓存区 StringBuffer StringBuilder builder = new StringBuilder(); while ((line = br.readLine()) != null) { builder.append(line); } br.close(); isr.close(); JSONObject root = new JSONObject(builder.toString()); System.out.println("name= " + root.getString("name") + " age= " + root.getInt("age") + " address= " + root.getString("address")); //读取多个数据 JSONArray array = root.getJSONArray("languages"); for (int i = 0; i < array.length(); i++) { JSONObject lan = array.getJSONObject(i); System.out.println("-----------------"); System.out.println("id= " + lan.getInt("id")); System.out.println("name= " + lan.getString("name")); System.out.println("ide= " + lan.getString("ide")); } } else { System.out.println("连接失败"); } } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } } }.start(); }
结果
JSON文本的编写
需要编写的格式文件
{"name":"baoqiang", "age":"18", "address":"ganzhou", "languages":[ {"id":1,"ide":"Eclipse","name":"java"}, {"id":2,"ide":"XCode","name":"Swift"}, {"id":3,"ide":"Visual Studio","name":"C##"} ]}
编写代码
try { JSONObject root = new JSONObject(); root.put("name", "baoqiang"); root.put("age", "12"); root.put("adress", "guanzhou"); /** * languages三行值 */ JSONObject lan1 = new JSONObject(); lan1.put("id", "1"); lan1.put("ide", "Eclipse"); lan1.put("name", "java"); JSONObject lan2 = new JSONObject(); lan2.put("id", "2"); lan2.put("ide", "Xcode"); lan2.put("name", "swift"); JSONObject lan3 = new JSONObject(); lan3.put("id", "3"); lan3.put("ide", "Studio"); lan3.put("name", "C#"); JSONArray array = new JSONArray(); array.put(lan1); array.put(lan2); array.put(lan3); root.put("languages", array); System.out.println(root.toString()); } catch (JSONException e) { e.printStackTrace(); }
结果
源码下载
json本地解析-源码:https://github.com/PengHongfu/Json_Local.git
json网络解析-源码:https://github.com/PengHongfu/Json_net.git
参考
http://blog.isming.me/blog/2014/06/04/parse-json-in-android/
- Android中JSON的解析-JSONObject和JSONArray
- Android JSON 解析(一) JSONObject 和 JSONArray
- Android JSON解析(JSONObject和JSONArray)
- Android JSON解析(JSONObject和JSONArray)
- jsonObject和jsonArray解析json的方式
- jsonObject和jsonArray解析json的方式
- json 的解析-使用Android中的JSONObject和JSONArray解析json数据
- Json的JSONArray和JSONObject
- Android中的JSONObject和JSONArray解析json数据
- android用JSONObject和JSONArray解析json格式数据
- Android-json解析(三):原生JSONObject+JSONArray的使用
- JSONObject/JSONArray解析json
- json数据解析<一> JSONObject和JSONArray的简单使用
- Android中Json的全解析(JSONObject,JSONArray,Gson,Jackson)
- JSON数据解析(JSONArray和JSONObject)
- 使用JSONObject和JSONArray 进行Json解析
- 用JSONObject和JSONArray 解析json数据
- JSONObject与JSONArray的使用-解析Json
- 仿微信-界面动画(8)提示框Click监听
- 【Spark Java API】Transformation(1)—mapPartitions、mapPartitionsWithIndex
- 处理string对象中的字符
- java 中的finalize()
- 在WebView中加载html内容出现乱码
- Android中JSON的解析-JSONObject和JSONArray
- TCP为什么要三次握手,不是两次四次
- 使用kotlin语言实现抽屉效果
- HDU 4707Pet
- 页面只读JS写法
- u-boot与linux内核间的参数传递过程分析
- java单例模式
- Session 'XXX': Error Installing APK
- HDU 5860 Death Sequence(DP+约瑟夫问题·改)