新注册了这个blog,正好这两天学写Android,需要解析本地的JSON文件,google一搜看到JSONlib这玩意儿挺靠谱,就大刀阔斧下了相关依赖包干了起来,没想到这下掉进了一个深坑,网上也查不到原因,在血海里翻腾了两天,如今好不容易爬了出来,与君分享,也作为开篇之作,不足之处还望指正。
对于初次解析JSON文件的童鞋可能会上网查找解析JSON文件的方法,于是网上有诸如JSONLIB, FASTJSON, GSON等方式,于是看的眼花撩乱。
其实。。我想说,Android自带的org.json包完全可以完成这个任务。。没必要去下载那些外部包
更坑的是,JSONLIB和Android自带的org.json包是冲突的。。which means, 你如果在java的开发环境下使用JSONLIB,完全没问题,不过你如果用Android的开发环境,不好意思,会报错
Error Message: AndroidRuntime java.lang.NoClassDefFoundError: Failed resolution of :Lnet/......JSONArray
这个原因完全是因为JSONLIB和org.JSON在包的命名上存在冲突 (当时我查的昏天黑地,反复纠结,在Java项目下用的好好地JSONLIB,为什么一放到Android就不行了呢,真是个大坑)
其实,JSONLIB与org.JSON的语法类似,
除了在新建对象时有所不同
JSONArray ja = new JSONArray(res); org.JSON
JSONArray ja = new JSONArray(); JSONLIB
ja.from(res)
在实际使用时两者几乎没有区别 e.g.
ja.getJb().getJSONArray("comments").getJSONObject(j).getString("time_created").toString()
1 import java.io.InputStream; 2 3 import org.apache.http.util.EncodingUtils; 4 import org.json.JSONArray; 5 import android.content.Context; 6 import com.example.test.R; 7 8 public class InitJson{ 9 public String sJsonResource; 10 public JSONArray ja; 11 public void init(Context context) { 12 try { 13 //读取JSON文件 14 InputStream in = context.getResources().openRawResource( 15 R.raw.community); 16 int length = in.available(); 17 byte[] buffer = new byte[length]; 18 in.read(buffer); 19 sJsonResource = EncodingUtils.getString(buffer, "BIG5"); 20 in.close(); 21 ja = new JSONArray(sJsonResource); 22 in.close(); 23 for (int i = 0; i < ja.length(); ++i) { 24 ja.getJSONObject(i).getString("time_created").toString(); 25 } 26 } catch (Exception e) { 27 e.printStackTrace(); 28 } 29 30 } 31 }
Last but no least
压根没必要去用外部库,Android自带的org.json就能解决你的一切关于JSON文件解析的问题,而且,并不复杂!