一行代码解析复杂JSON文件:利用Android自带的包解析JSON

上周写了一篇关于Android自带的org.JSON与JSONLIB相冲突的文章,今天我想写一下我对org.json使用的小心得

由于学校项目要求解析一个复杂JSON,所以就上网搜了一下,不过Google一搜JSON数据解析,会出现五花八门的结果,JSONLIB, GSON, FASTJSON等等,唯独没有对org.json的使用,其实Android自带的JSON解析包相当好用,其用法与JSONLIB类似,我是先用的JSONLIB,在JRE环境下用得好好的,到了Android下怎么都跑不通(原来是包冲突T_T,也遇到这个深坑的同学可以翻我另外一篇关于这两个包冲突的文章)

其实我建议,就用org.json包就好了,并且可以用很简单的几行代码完成复杂的JSON解析,最初我上网看了一些文章,为了解析一个复杂JSON文件又是递归又是干嘛的,实在太费劲了,也没必要。

废话少说,贴上我的代码

 1 package com.helpers;
 2
 3 import java.io.InputStream;
 4
 5 import org.apache.http.util.EncodingUtils;
 6 import org.json.JSONArray;
 7
 8 import android.content.Context;
 9
10 import com.example.test.R;
11
12 public class Helpers {
13     public String res;
14     public JSONArray ja;
15
16     public void init(Context context) {
17         try {
18             // 读取JSON文件
19             InputStream in = context.getResources().openRawResource(
20                     R.raw.community);
21             int length = in.available();
22             byte[] buffer = new byte[length];
23             in.read(buffer);
24             res = EncodingUtils.getString(buffer, "BIG5");
25             in.close();
26             // 实例化JSONArray, 因为我的JSON文件的最外层是Array,如果你是Object就应该实例化一个JSONObject
27             ja = new JSONArray(res);
28             for (int i = 0; i < ja.length(); ++i) {
29                 //看看这一行很复杂,其实不难
30                 //我的JSON文件中有20个JSONObject的主题,ja.getJSONObject(i)循环读取
31                 //每个主题中有一个comments的Array存放了所有对于这个主题所有的评论getJSONArray("comments")
32                 //ja.getJSONObject(i).getJSONArray("comments").getJSONObject(i),因为每个comments也是JSONObject这里第二个getJSONObject(i)就是获取这些comments中的第一个comments
33                 //在comments这个Object下还有一个JSONObject叫author,它里面存放了comments得信息,所以通过getJSONObject("author")
34                 //然后这已经是最后一层了,再往下已经没有子属的JSONObject或者JSONArray了,getString("profile_image"),大功告成
35                 System.out.println(ja.getJSONObject(i).getJSONArray("comments").getJSONObject(i)
36                         .getJSONObject("author").getString("profile_image"));
37             }
38         } catch (Exception e) {
39             e.printStackTrace();
40         }
41
42     }
43 }

如果你看懂这个例子,那你应该明白了,JSONArray中可以嵌套JSONObject,也可以嵌套JSONArray,反之依然,JSONObject也可以嵌套ARRAY或者Object。无论多么复杂的JSON文件,解析的时候就是不断通过getJSONObject或者getJSONArray。JSON的解析说来说去就是层层获取(getJSONObject,getJSONArray),达到你想获取的数据所在的Object或者Array,然后getString,大功告成。

搞清楚这个道理,再复杂的JSON数据文件,只要一行代码,分分钟解出来!

时间: 2024-10-13 10:47:25

一行代码解析复杂JSON文件:利用Android自带的包解析JSON的相关文章

【转载】一行代码加载网络图片到ImageView——Android Picasso

原文链接:一句代码加载网络图片到ImageView——Android Picasso 在这里介绍一个Android框架:Picasso. picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能.仅仅只需要一行代码就能完全实现图片的异步加载.代码如下: public class MainActivity extends Activity { private ImageView imageV

C#.NET序列化XML、JSON、二进制微软自带DLL与newtonsoft(json.net)

序列化是将对象转换成另一种格式(XML.json.二进制byte[]) JSON序列化 .NET中有三种常用的JSON序列化的类,分别是: Newtonsoft.Json.JsonConvert类(推荐) Newtonsoft.Json.JsonConvert类是非微软提供的一个JSON序列化和反序列的开源免费的类库(下载网址是:http://www.codeplex.com/json/),它提供了更灵活的序列化和反序列化控制,并且如果你的开发环境使用的是.NET Framework3.5及以后

C# 解析嵌套的json文件.

概述 今天我同学问我如何转换json文件,没处理过,网上搜了一下,json转excel的很少,反过来倒是有许多人写了工具. json文件的结构大致是这样的: 1 {"votes": {"funny": 0, "useful": 7, "cool": 0}, "user_id": "CR2y7yEm4X035ZMzrTtN9Q", "name": "Jim&q

oc解析JSON文件

1利用NSBundle 取得json文件路径 NSString *path=[[NSBundle mainBundle]pathForResource:@"help.json" ofType:nil]; 2把文件转成NSData NSData *data=[NSData dataWithContentsOfFile:path]; 3利用NSJSONSerialization把data解析成数组或字典类型 NSArray *dicArray=[NSJSONSerialization JS

Java8读文件仅需一行代码

JDK7中引入了新的文件操作类java.nio.file.File,它包含了很多有用的方法来操作文件,比如检查文件是否为隐藏文件,或者是检查文件是否为只读文件.开发者还可以使用Files.readAllBytes(Path)方法把整个文件读入内存,此方法返回一个字节数组,还可以把结果传递给String的构造器,以便创建字符串输出. 此方法确保了当读入文件的所有字节内容时,文件属性是关闭的,否则就会出现IO异常或其它的未检查异常.这意味着在读文件到最后的块内容后,无需关闭文件.要注意,此方法不适合

Cocos2dx&amp;Lua - UI显示优化之如何解决解析大量json文件

GUIReader中有个widgetFromJsonFile的方法,此方法是用于解析json文件(cocostudio生成的UI的)并返回该文件的父节点(Widget),然后便于进一步的UI操作(如获得各种子类进行填充数据作显示等). 那么这时候问题就来了,当需要在一个页面或一个控件(尤其是翻页.列表等)中,需要加载入大量的节点(均是由单独json解析得到的),这时,假如你要加入的子节点的json文件在10K左右以上,那么这种大量加载将会使手机非常痛苦(一个几K左右的,在加载数量达到50个左右时

Apache Spark技术实战之4 -- 利用Spark将json文件导入Cassandra

欢迎转载,转载请注明出处. 概要 本文简要介绍如何使用spark-cassandra-connector将json文件导入到cassandra数据库,这是一个使用spark的综合性示例. 前提条件 假设已经阅读技术实战之3,并安装了如下软件 jdk scala sbt cassandra spark-cassandra-connector 实验目的 将存在于json文件中的数据导入到cassandra数据库,目前由cassandra提供的官方工具是json2sstable,由于对cassandr

Python学习之旅-10-文件储存:txt文件、csv文件、json文件

1.存储数据txt文件. 1.1 实例: # 1 存储 txt 文件 data = '''我是一个txt文件''' # 存储的文件名:file='test.txt' # 文件打开方式:mode='a' # 编码格式:encoding='UTF-8' with open(file='test.txt',mode='a',encoding='UTF-8') as f : f.write(data) # 保存内容 f.close() # 关闭文件 1.2 打开文件的不同模式: 模式 描述 r r,以只

Python 基础 - Json文件读写

JSON介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). 在python中,JSON 由列表和字典组成. 序列化的两个模块中,json模块是用于