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 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();
	}

转发请注明出处:http://blog.csdn.net/jycboy

另附一篇很好的博文,介绍了很多方法:http://www.open-open.com/lib/view/open1326376799874.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-02 02:04:27

android Json详解的相关文章

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

上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑. 上篇:android WebView详解,常见漏洞详解和安全源码(上) 转载请注明出处:http://blog.csdn.net/self_study/article/details/55046348 对技术感兴趣的同鞋加群 544645972 一起交流. WebView 常见漏洞 WebView 的漏洞也是不少,列举一些常见的漏洞,实时更新,如果有其他的常见漏洞,知会一下我-- WebView

[gitbook] Android框架分析系列之Android Binder详解

请支持作者原创: https://mr-cao.gitbooks.io/android/content/android-binder.html Android Binder详解 Table of Contents 1. binder简介 2. binder的实现 2.1. IBinder类简介 2.2. IInterface类简介 2.3. BpBinder和BBinder简介 2.4. ProcessState和IPCThreadState简介 2.5. ServiceManager简介 2.

android动画详解三 动画API概述

· 属性动画与view动画的不同之处 view动画系统提供了仅动画View 对象的能力,所以如果你想动画非View 对象,你就要自己实现代码. view动画系统实际上还被强制仅能对 View 的少数属性进行动画,比如缩放和旋转,而不能对背景色进行. view动画的另一个坏处是它仅修改View的绘制位置,而不是View的实际位置.例如,如果你动画一个移动穿越屏幕,button的绘制位置是正确的,但实际你可以点击它的位置却没有变,所以你必须去实现你自己的逻辑来处理它. 使用属性动画系统时,这个限制被

android矩阵详解

Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 在Android里面,Matrix由9个float值构成,是一个3*3的矩阵.最好记住.如下图: 解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的. translateX和translateY表示x和y的平移量.scale是缩放的比例,1是不变,2是表示缩放1/2,这样子. 在android.graphics.Matrix中有对应旋转的函

Android ProgressBar详解以及自定义

版本:1.0 日期:2014.5.16 版权:© 2014 kince 转载注明出处 这一次主要说一下Android下的进度条,为什么是它呢,因为近期被其各种美轮美奂的设计所倾倒,计划逐渐去实现.另外一个因素也是它也是为数不多的直接继承于View类的控件,从中可以学习到一些自定义控件的知识.下面列举了一些个人觉得还算漂亮的进度条,仅供参考. 是不是很漂亮,其实就像上面图形展示的那样,进度条大体上无非就是这几种形式.这样一来肯定是需要自定义了,所以方向有两个:要么继承于系统的ProgressBar

问题:JsonConvert;结果:JSON详解

JSON详解 JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格式,为什么没 有选择XML呢?因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据 多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们更倾向于选择JSON来交换数据.这篇文章主要从以下几

Android 菜单详解

Android中菜单分为三种,选项菜单(OptionMenu),上下文菜单(ContextMenu),子菜单(SubMenu) 选项菜单 可以通过两种办法增加选项菜单,一是在menu.xml中添加,该种方式参见Android 资源详解(二) 菜单资源,二是在.java中添加 1.覆盖Activity 的 onCreateOptionsMenu(Menu  menu)方法,当我们第一次打开菜单 时该方法被自动调用. 2.调用Menu的 add()方法添加菜单项(Menultem) ,可以调用Men

Android菜单详解(一)——理解android中的Menu

前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至今为止看到的最好的一本android书,中文版出到<精通Android 2>. 理解Android的菜单 菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu"键,由此可见菜单在Android程序中的特殊性.An

Android surfaceview详解

周末看<精通Android游戏开发>(Pro Android Games),里面讲到游戏的框架,其中一个重要的概念surfaceview,觉得不是很理解,于是花了一点时间研究了下,写下自己的心得. surface,这个单词的意思是浮在表面的,那么surfaceview就是浮在表面的view了.如果真的这样解释,估计有人要拍砖了.然而,话虽不能这么说,取这个名儿,多少还是有点关系的.surface是一个可见区域. 我们在屏幕上看到的这些view,在屏幕上看到的就是画面,在内存中就是一块内存区.绘