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 to endArray() and every call to object() must have a matching call to endObject().  //每次调用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详解相关推荐

  1. android Json详解

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

  2. android WebView详解,常见漏洞详解和安全源码(下)

    上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑.  上篇:android WebView详解,常见漏洞详解和安全源码(上)  转载请注明出处:http ...

  3. android rotate 动画,Android RotateAnimation详解

    RotateAnimation旋转坐标系为以旋转点为坐标系(0,0)点.x轴为0度,顺时针方向旋转一定的角度. 1.RotateAnimation(fromDegrees, toDegrees) [默 ...

  4. Android MVP 详解(上)

    作者:李旺成 时间:2016年4月3日 "Android MVP 详解(下)"已经发布,欢迎大家提建议. MVP 在 Android 上的使用其实已经有挺长一段时间了,长到似乎有点 ...

  5. 【转】Android菜单详解——理解android中的Menu--不错

    原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...

  6. Android菜单详解——理解android中的Menu

    前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...

  7. Android LayoutInflater详解

    Android LayoutInflater详解 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类 似于findViewById().不同点是LayoutInflater是用来 ...

  8. android Fragments详解

    android Fragments详解一:概述 android Fragments详解二:创建Fragment 转载于:https://my.oschina.net/liangzhenghui/blo ...

  9. android WebView详解,常见漏洞详解和安全源码(上)

    这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析.  由于博客内容长度,这次将分为上下两篇,上篇详解 WebView ...

最新文章

  1. expires与etag控制页面缓存的优先级
  2. 添加议题模块html,WordPress 技巧:为评论模块增加更多 HTML 标签支持
  3. leetcode算法题--礼物的最大价值
  4. 成功解决TypeError: 'float' object cannot be interpreted as an integer
  5. The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xm
  6. Pentest Box -windows平台的linux bash,集成了很多测试工具
  7. Bootstrap4+MySQL前后端综合实训-Day06-PM【MD5加码-生成32位md5码、ResultData.java、分页查询用户数据、添加用户按钮的实现】
  8. go语言扫描四位数可用域名
  9. Python使用数学形态学方法处理图像
  10. 小腹右侧突然疼了一下_腰椎间盘膨出,为什么不是脊椎柱中间疼,而是左侧疼?...
  11. 被果树点名做一个Blog游戏,答案如下...接下来换我点名了~~!!!
  12. Newtonsoft.Json.Compact
  13. 86版五笔字根表(JPG版)
  14. 如何直观形象的理解方向导数与梯度以及它们之间的关系?
  15. CAD零基础教程笔记
  16. Word,PDF,PPT,TXT之间的转换方法。
  17. 各个开发工具格式化代码的快捷键
  18. 一元三次方程求根公式及韦达定理
  19. redis 经纬度_【SpringBoot DB 系列】Redis 高级特性之 GEO
  20. 终端、控制台、虚拟终端、伪终端的概念,阐述终端与shell的关系

热门文章

  1. C++中MessageBox()的详细用法(转载)
  2. 用友服务器整体迁移--数据库附加
  3. photoshop修复面部的皱纹
  4. 趣味理解:三层架构与养猪—《.NET深入体验与实战精要》
  5. 使用TensorRT加速yolo3
  6. 使用Masonry实现UILabel和UIIMageView自适应长度居中
  7. Linux用户管理-服务管理
  8. JDK源码分析-Integer
  9. shell 生成指定范围随机数与随机字符串 .
  10. 有多少可爱IT精英,他们的爱情屡屡“挨踢”