1》JSON的定义:
       一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。

2》android2.3提供的json解析类
android的json解析部分都在包org.json下,主要有以下几个类:

2.1》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.NULL object 。

2.2》JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

2.3》JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如: [value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为, get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

2.4》JSONTokener:json解析类

2.5》JSONException:json中用到的异常

3》JSONObject, JSONArray来构建json文本

1.// 假设现在要创建这样一个json文本
2.//  {
3.//      "phone" : ["12345678", "87654321"], // 数组
4.//      "name" : "yuanzhifei89", // 字符串
5.//      "age" : 100, // 数值
6.//      "address" : { "country" : "china", "province" : "jiangsu" }, // 对象
7.//      "married" : false // 布尔值
8.//  }
9.
10.try {
11.    // 首先最外层是{},是创建一个对象
12.    JSONObject person = new JSONObject();
13.    // 第一个键phone的值是数组,所以需要创建数组对象
14.    JSONArray phone = new JSONArray();
15.    phone.put("12345678").put("87654321");
16.    person.put("phone", phone);
17.
18.    person.put("name", "yuanzhifei89");
19.    person.put("age", 100);
20.    // 键address的值是对象,所以又要创建一个对象
21.    JSONObject address = new JSONObject();
22.    address.put("country", "china");
23.    address.put("province", "jiangsu");
24.    person.put("address", address);
25.    person.put("married", false);
26.} catch (JSONException ex) {
27.    // 键为null或使用json不支持的数字格式(NaN, infinities)
28.    throw new RuntimeException(ex);
29.}

4》 getType和optType api的使用

getType可以将要获取的键的值转换为指定的类型,如果无法转换或没有值则抛出JSONException 
optType也是将要获取的键的值转换为指定的类型,无法转换或没有值时返回用户提供或这默认提供的值

1.try {
2.    // 所有使用的对象都是用上面创建的对象
3.    // 将第一个电话号码转换为数值和将名字转换为数值
4.    phone.getLong(0);
5.    person.getLong("name"); // 会抛异常,因为名字无法转换为long
6.    phone.optLong(0); // 代码内置的默认值
7.    phone.optLong(0, 1000); // 用户提供的默认值
8.    person.optLong("name");
9.    person.optLong("name", 1000); // 不像上面那样抛异常,而是返回1000
10.} catch (JSONException ex) {
11.    // 异常处理代码
12.}

5》除了上面的两个类,还可以使用JSONStringer来构建json文本

1.try {
2.    JSONStringer jsonText = new JSONStringer();
3.    // 首先是{,对象开始。object和endObject必须配对使用
4.    jsonText.object();
5.
6.    jsonText.key("phone");
7.    // 键phone的值是数组。array和endArray必须配对使用
8.    jsonText.array();
9.    jsonText.value("12345678").value("87654321");
10.    jsonText.endArray();
11.
12.    jsonText.key("name");
13.    jsonText.value("yuanzhifei89");
14.    jsonText.key("age");
15.    jsonText.value(100);
16.
17.    jsonText.key("address");
18.    // 键address的值是对象
19.    jsonText.object();
20.    jsonText.key("country");
21.    jsonText.value("china");
22.    jsonText.key("province");
23.    jsonText.value("jiangsu");
24.    jsonText.endObject();
25.
26.    jsonText.key("married");
27.    jsonText.value(false);
28.
29.    // },对象结束
30.    jsonText.endObject();
31.} catch (JSONException ex) {
32.    throw new RuntimeException(ex);
33.}

6》json文本解析类JSONTokener  
按照RFC4627规范将json文本解析为相应的对象。

对于将json文本解析为对象,只需要用到该类的两个api: 
构造函数 
public Object nextValue();

1.//  {
2.//      "phone" : ["12345678", "87654321"], // 数组
3.//      "name" : "yuanzhifei89", // 字符串
4.//      "age" : 100, // 数值
5.//      "address" : { "country" : "china", "province" : "jiangsu" }, // 对象
6.//      "married" : false // 布尔值
7.//  }
8.
9.private static final String JSON =
10."{" +
11.    "   \"phone\" : [\"12345678\", \"87654321\"]," +
12.    "   \"name\" : \"yuanzhifei89\"," +
13.    "   \"age\" : 100," +
14.    "   \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," +
15.    "   \"married\" : false," +
16."}";
17.
18.try {
19.    JSONTokener jsonParser = new JSONTokener(JSON);
20.    // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。
21.    // 如果此时的读取位置在"name" : 了,那么nextValue就是"yuanzhifei89"(String)
22.    JSONObject person = (JSONObject) jsonParser.nextValue();
23.    // 接下来的就是JSON对象的操作了
24.    person.getJSONArray("phone");
25.    person.getString("name");
26.    person.getInt("age");
27.    person.getJSONObject("address");
28.    person.getBoolean("married");
29.} catch (JSONException ex) {
30.    // 异常处理代码
31.}

其它的api基本就是用来查看json文本中的文本的

1.try {
2.    JSONTokener jsonParser = new JSONTokener(JSON);
3.    // 继续向下读8个json文本中的字符。此时刚开始,即在{处
4.    jsonParser.next(8); //{    "phone。tab算一个字符
5.
6.    // 继续向下读1个json文本中的字符
7.    jsonParser.next(); //"
8.
9.    // 继续向下读取一个json文本中的字符。该字符不是空白、同时也不是注视中的字符
10.    jsonParser.nextClean(); //:
11.
12.    // 返回当前的读取位置到第一次遇到'a'之间的字符串(不包括a)。
13.    jsonParser.nextString('a'); //  ["12345678", "87654321"],    "n(前面有两个空格)
14.
15.    // 返回当前读取位置到第一次遇到字符串中(如"0089")任意字符之间的字符串,同时该字符是trimmed的。(此处就是第一次遇到了89)
16.    jsonParser.nextTo("0089"); //me" : "yuanzhifei
17.
18.    // 读取位置撤销一个
19.    jsonParser.back();
20.    jsonParser.next(); //i
21.
22.    // 读取位置前进到指定字符串处(包括字符串)
23.    jsonParser.skipPast("address");
24.    jsonParser.next(8); //" : { "c
25.
26.    // 读取位置前进到执行字符处(不包括字符)
27.    jsonParser.skipTo('m');
28.    jsonParser.next(8); //married"
29.} catch (JSONException ex) {
30.    // 异常处理代码
31.}

下面这个是自己修改别人的小例子,主要是加一些注释和讲解,这个例子主要是使用android进行json解析。

单数据{'singer':{'id':01,'name':'tom','gender':'男'}}
多个数据{"singers":[ {'id':02,'name':'tom','gender':'男'}, {'id':03,'name':'jerry,'gender':'男'},
{'id':04,'name':'jim,'gender':'男'},
{'id':05,'name':'lily,'gender':'女'}]}

下面的类主要是解析单个数据parseJson()和多个数据的方法parseJsonMulti():

public class JsonActivity extends Activity { /** Called when the activity is first created. */ private TextView tvJson; private Button btnJson; private Button btnJsonMulti; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tvJson = (TextView) this.findViewById(R.id.tvJson); btnJson = (Button) this.findViewById(R.id.btnJson); btnJsonMulti = (Button) this.findViewById(R.id.btnJsonMulti); btnJson.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // url // String strUrl = "http://10.158.166.110:8080/AndroidServer/JsonServlet"; String strUrl = ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGER); //获得返回的Json字符串 String strResult = connServerForResult(strUrl); //解析Json字符串 parseJson(strResult); } }); btnJsonMulti.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String strUrl = ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGERS); String strResult = connServerForResult(strUrl); //获得多个Singer parseJsonMulti(strResult); } }); } private String connServerForResult(String strUrl) { // HttpGet对象 HttpGet httpRequest = new HttpGet(strUrl); String strResult = ""; try { // HttpClient对象 HttpClient httpClient = new DefaultHttpClient(); // 获得HttpResponse对象 HttpResponse httpResponse = httpClient.execute(httpRequest); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 取得返回的数据 strResult = EntityUtils.toString(httpResponse.getEntity()); } } catch (ClientProtocolException e) { tvJson.setText("protocol error"); e.printStackTrace(); } catch (IOException e) { tvJson.setText("IO error"); e.printStackTrace(); } return strResult; } // 普通Json数据解析 private void parseJson(String strResult) { try { JSONObject jsonObj = new JSONObject(strResult).getJSONObject("singer"); int id = jsonObj.getInt("id"); String name = jsonObj.getString("name"); String gender = jsonObj.getString("gender"); tvJson.setText("ID号"+id + ", 姓名:" + name + ",性别:" + gender); } catch (JSONException e) { System.out.println("Json parse error"); e.printStackTrace(); } } //解析多个数据的Jsonprivate void parseJsonMulti(String strResult) { try { JSONArray jsonObjs = new JSONObject(strResult).getJSONArray("singers"); String s = ""; for(int i = 0; i < jsonObjs.length() ; i++){ JSONObject jsonObj = ((JSONObject)jsonObjs.opt(i)) ;//注意:原文有问题,这里跟原文不一致int id = jsonObj.getInt("id"); String name = jsonObj.getString("name"); String gender = jsonObj.getString("gender"); s +=  "ID号"+id + ", 姓名:" + name + ",性别:" + gender+ "\n" ; } tvJson.setText(s); } catch (JSONException e) { System.out.println("Jsons parse error !"); e.printStackTrace(); } }
}

原文 URL:http://www.open-open.com/lib/view/open1326376799874.html



Android Json操作相关推荐

  1. Android json操作之取得一个对象

    1:服务端返回的json数据格式如下: {"id":"1001","name":"zhangsan","sco ...

  2. Android Json生成及解析实例

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...

  3. android json mysql_Android通过json向MySQL中读写数据的方法详解【读取篇】

    本文实例讲述了Android通过json向MySQL中读取数据的方法.分享给大家供大家参考,具体如下: 首先 要定义几个解析json的方法parseJsonMulti,代码如下: private vo ...

  4. android Json解析详解(详细代码)

    android Json解析详解(详细代码)   JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当 ...

  5. Android json解析有关内容学习笔记

    http://www.2cto.com/kf/201301/185026.html 毋庸置疑,Json是当下最主流最受欢迎的数据交换格式,得益于json的简单易用,一直没有系统的学习有关json的知识 ...

  6. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

    目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...

  7. python json数据格式数组内元素递增赋值_python深浅复制,类型转换, json操作,数组操作...

    python深浅复制 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷 ...

  8. Android 文件操作

    Android 文件操作操作时,要赋予相应的权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_S ...

  9. Android SDCard操作(文件读写,容量计算)

    Android SDCard操作(文件读写,容量计算) android.os.Environment 提供访问环境变量 java.lang.Object android.os.Environment ...

最新文章

  1. verify https android,信任https
  2. find到带空格文件名用xargs处理的技巧
  3. python dataframe groupby_【Python数据分析基础】入坑必备的数据预处理操作
  4. VTK:图片之ImageLaplacian
  5. php 伪静态是什么意思,路由与伪静态
  6. 希尔排序(分而治之)
  7. 暑假第二周总结(2018.7.16——7.22)
  8. Android 使用AsyncTask 后监听异步加载完毕的动作
  9. java中static_认识java中的static
  10. 根据某个字段判断是否添加条件
  11. 学习python-day1
  12. 易筋SpringBoot 2.1 | 第三篇:RestTemplate请求HTTP(1)
  13. 微信支付app支付怎么快速开通
  14. 《敏捷软件开发》— 敏捷开发 — 敏捷实践
  15. PPT中如何插入页码和母版修改
  16. 初识Excel (Excel基础一)树形图
  17. 单元测试利器-Mockito 中文文档
  18. 陌上红尘,可有摆渡人?
  19. 开源直播美颜SDK工具算法分析
  20. 手机网站(wap)广告展示一般都有哪些表现形式?

热门文章

  1. android listview的一些设置
  2. android ProgressBar 自定义进度条颜色
  3. SQL Server数据库查询区分大小写、全半角——排序规则的应用(转载)
  4. CTR预估中GBDT与LR融合方案
  5. 代理模式【介绍、静态代理、动态代理、入门、应用】
  6. Spring整合Hibernate。。。。
  7. Delphi10 安装Graphics32
  8. css transition animation
  9. ./dmitry -p ip或者域名 -f -b
  10. NX界面中获取线、面、体、特征的tag值