android Json详解
Json:一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
官网地址:http://www.json.org/
JSON Vs XML
1.JSON和XML的数据可读性基本相同
2.JSON和XML同样拥有丰富的解析手段
3.JSON相对于XML来讲,数据的体积小
4.JSON与JavaScript的交互更加方便
5.JSON对数据的描述性比XML较差
6.JSON的速度要远远快于XML
一、JSON语法
JSON 语法规则
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON 名称/值对
JSON 数据的书写格式是:名称/值对。
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"firstName" : "John"
JSON 值
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
- JSONObject
- JSONArray
JSON 对象
JSON 对象在花括号中书写:
对象可以包含多个名称/值对:
{ "firstName":"John" , "lastName":"Doe" }
一个{}就是一个JSONObject
JSON 数组
JSON 数组在方括号中书写:
数组可包含多个对象:
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
在上面的例子中,对象 "employees" 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。
二、android提供的json解析类
android的json解析部分都在包org.json下,主要有以下几个类:
JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External: 应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之间是以逗号","分隔。Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULLobject 。
JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。
JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如: [value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为, get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。
JSONTokener:json解析类
JSONException:json中用到的异常
1.JSONObject,JSONArray解析,创建Json
示例代码:
/*
json:{
"languages":[
{"id":1,"ide":"Eclispe","name":"java"},
{"id":2,"ide":"Xcode","name":"Swift"},
{"id":3,"ide":"Visual Studio","name":"C++"}],
"cat":{"cat":"miao"}
}
*/
public void creatJson2(){
try {
JSONObject root = new JSONObject();
JSONObject cat = new JSONObject();
cat.put("cat", "miao");
JSONArray array = new JSONArray();
JSONObject lan1 = new JSONObject();
lan1.put("id", 1).put("ide", "Eclispe").put("name", "java");
JSONObject lan2 = new JSONObject();
lan2.put("id", 2).put("ide", "Xcode").put("name", "Swift");
JSONObject lan3 = new JSONObject();
lan3.put("id", 3).put("ide", "Visual Studio").put("name", "C++");
array.put(lan1);
array.put(lan2);
array.put(lan3);
root.put("languages", array);
root.put("cat", cat);
System.out.println("json:"+root.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
然后是解析的代码:
public void parseJson(){
try {
InputStreamReader is = new InputStreamReader(getAssets().open("test2.json"), "UTF-8");
BufferedReader br = new BufferedReader(is);
String line;
StringBuilder builder = new StringBuilder();
while((line=br.readLine())!=null){
builder.append(line);
}
is.close();br.close();
JSONObject root = new JSONObject(builder.toString());
System.out.println("cat:"+root.getString("cat"));
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("ide="+lan.getString("ide"));
System.out.println("name="+lan.getString("name"));
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这时解析的源文件:
{
"languages":[
{"id":1,"ide":"Eclipse","name":"java"},
{"id":2,"ide":"Xcode","name":"Swift"},
{"id":3,"ide":"Visual Studio","name":"C++"}
],
"cat":"miao"
}
2.JSONStringer生成json
Stringers only encode well-formed JSON strings. In particular:
- The stringer must have exactly one top-level array or object.
- Lexical scopes must be balanced: every call to
array()
must have a matching call toendArray()
and every call toobject()
must have a matching call toendObject()
. //每次调用array(),必须匹配endArray,object,endObject同理。 - Arrays may not contain keys (property names).
- Objects must alternate keys (property names) and values.
- Values are inserted with either literal
value
calls, or by nesting arrays or objects.
它定义的所有方法:
它定义的所有方法:
Public Constructors | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
JSONStringer() |
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
JSONStringer array()
Begins encoding a new array.
|
|||||||||||
JSONStringer endArray()
Ends encoding the current array.
|
|||||||||||
JSONStringer endObject()
Ends encoding the current object.
|
|||||||||||
JSONStringer key(String name)
Encodes the key (property name) to this stringer.
|
|||||||||||
JSONStringer object()
Begins encoding a new object.
|
|||||||||||
String toString()
Returns the encoded JSON string.
|
|||||||||||
JSONStringer value(double value)
Encodes
value to this stringer. |
|||||||||||
JSONStringer value(Object value)
Encodes
value . |
|||||||||||
JSONStringer value(long value)
Encodes
value to this stringer. |
|||||||||||
JSONStringer value(boolean value)
Encodes
value to this stringer. |
它的方法不多,很精简,所以说用Stringer创建json还是很简单的。
示例代码:
/*json:{
"languages":[
{"id":1,"ide":"Eclispe","name":"java"},
{"id":2,"ide":"Xcode","name":"Swift"},
{"id":3,"ide":"Visual Studio","name":"C++"}],
"cat":{"name":"miao"}
}*/
public String createJson(){
JSONStringer stringer = new JSONStringer();
//every call to array() must have a matching call to endArray() and
//every call to object() must have a matching call to endObject().
try {
stringer.object();
stringer.key("languages");
stringer.array();
//数组中的三个对象
stringer.object();
stringer.key("id").value(1).key("ide").value("Eclispe").key("name").value("java");
stringer.endObject();
stringer.object();
stringer.key("id").value(2).key("ide").value("Xcode").key("name").value("Swift");
stringer.endObject();
stringer.object();
stringer.key("id").value(3).key("ide").value("Visual Studio").key("name").value("C++");
stringer.endObject();
stringer.endArray();//数组结束
stringer.key("cat");
stringer.object();
stringer.key("name").value("miao").endObject(); //结束object
stringer.endObject();
System.out.println("json:"+stringer.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return stringer.toString();
}
Json数据的解析与生成还是很简单的,可以多去官网看看,多看看文档。。。android总结任重道远啊,写博文就是动力啊,坚持坚持。。。。。
转发请注明出处:http://www.cnblogs.com/jycboy/p/json_xj.html
另附一篇很好的博文,介绍了很多方法:http://www.open-open.com/lib/view/open1326376799874.html
android Json详解的更多相关文章
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- JSON详解(转)
JSON详解 JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格 ...
- Android ActionBar详解
Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar 目录(?)[+] 第4 ...
- Android 签名详解
Android 签名详解 AndroidOPhoneAnt设计模式Eclipse 在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...
- Android编译系统详解(一)
++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...
- Android布局详解之一:FrameLayout
原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...
- 【整理修订】Android.mk详解
Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...
- Android菜单详解(四)——使用上下文菜单ContextMenu
之前在<Android菜单详解(二)——创建并响应选项菜单>和<Android菜单详解(三)——SubMenu和IconMenu>中详细讲解了选项菜单,子菜单和图标菜单.今天接 ...
随机推荐
- [转] VB之Val()函数的使用
在VB中,也许你或多或少会希望得到的数据转换成数字类型,数字类型既可以是整形,单精度,双精度,浮点数,只要是数字类型这个都可以使用,不过此函数只返回字符串中包含的数字,若第一个字符为字母或者非数字字符 ...
- ROC和AUC介绍以及如何计算AUC ---好!!!!
from:https://www.douban.com/note/284051363/?type=like 原帖发表在我的博客:http://alexkong.net/2013/06/introduc ...
- java io系列06之 序列化总结(Serializable 和 Externalizable)
本章,我们对序列化进行深入的学习和探讨.学习内容,包括序列化的作用.用途.用法,以及对实现序列化的2种方式Serializable和Externalizable的深入研究. 转载请注明出处:http: ...
- wcf服务返回json
private static void CreateErrorReply(OperationContext operationContext, string key, HttpStatusCode s ...
- SQL Server里强制参数化的痛苦
几天前,我写了篇SQL Server里简单参数化的痛苦.今天我想继续这个话题,谈下SQL Server里强制参数化(Forced Parameterization). 强制参数化(Forced Par ...
- Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
导读 行文本输入框在用于界面的文本输入,在WEB登录表单中应用广泛.一般行文本编辑框可定制性较高,既可以当作密码输入框,又可以作为文本过滤器.QLineEdit本身使用方法也很简单,无需过多的设置就能 ...
- 判断windows操作系统平台
判断当前Windows系统是win2000,winXP,winVista,win2003,win7... private static IntPtr GetSysTrayWnd() { IntPtr ...
- [CLR via C#]14. 字符、字符串和文本处理
一.字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构(一个值类型) 的一个实例.System ...
- jquery实现全选功能
主要是模拟一些网页中的表格实现全选功能. <form> 你爱好的运动是: <input type="checkbox" id="Check" ...
- js不间断滚动
CSS ul, li { margin: 0; padding: 0; } #scrollDiv { width: 300px; height: 25px; line-height: 25px; bo ...