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 Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  2. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  3. JSON详解(转)

    JSON详解 JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格 ...

  4. Android ActionBar详解

    Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar   目录(?)[+]   第4 ...

  5. Android 签名详解

    Android 签名详解 AndroidOPhoneAnt设计模式Eclipse  在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...

  6. Android编译系统详解(一)

    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...

  7. Android布局详解之一:FrameLayout

      原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...

  8. 【整理修订】Android.mk详解

    Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...

  9. Android菜单详解(四)——使用上下文菜单ContextMenu

    之前在<Android菜单详解(二)——创建并响应选项菜单>和<Android菜单详解(三)——SubMenu和IconMenu>中详细讲解了选项菜单,子菜单和图标菜单.今天接 ...

随机推荐

  1. 支付SDK的安全问题——隐式意图可导致钓鱼攻击

     该漏洞涉及到app所使用的intent和intent filter. intent是一个可用于从一个app组件请求动作或处理事件的“消息对象”.Intent负责对应用中一次操作的动作.动作涉及数据. ...

  2. JS文档和Demo自动化生成工具 - SmartDoc发布

    曾几何时,当你码神附体,一路披荆斩棘的完成代码后,带着“一码在手,天下我有”的傲然环顾之时,却发现单元测试.API文档.Demo实例陆续向你砸来,顿时有木有一种冰水挑战后的感觉.而这时你应该:哟哟,快 ...

  3. 移动安全时代,如何保护你的app

    Android系统的安全性历来备受诟病,在强大的反编译工具下,APK中的代码逻辑一览无余:重打包技术使得各种盗版软件层出不穷,充斥着Android市场,特别是对于金融.电商.游戏等产品的盗版应用,严重 ...

  4. STL中的set/multiset小结

    (1)使用set/multiset之前必须包含头文件<set>:#include<set> (2)namespace std{ template <class T, cl ...

  5. SQL Server 2016里TempDb的提升

    几个星期前,SQL Server 2016的最新CTP版本已经发布了:CTP 2.4(目前已经是CTP 3.0).这个预览版相比以前的CTP包含了很多不同的提升.在这篇文章里我会谈下对于SQL Ser ...

  6. MyBatis魔法堂:各数据库的批量Update操作

    一.前言   MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了.本篇仅记录批量update操作的sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了. ...

  7. [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划

      SCRUM 流程的步骤2: Spring 计划 1. 确保product backlog井然有序.(参考示例图1) 2. Sprint周期,一个冲刺周期,长度定为两周,本学期还有三个冲刺周期. 3 ...

  8. 《构建之法》第8、9、10章 读书笔记和Sprint总结

    第八章:需求分析 这章主要解析了需求的多面方面,不同的项目需要不同的手段,真正的需求稍纵即逝,需要靠火眼金睛和敏捷的身手来发现并抓住它们.另外,很多时候用户并不知道自己确切的需求,或者不愿意表达完整的 ...

  9. Win10安装.net framework 4.0失败提示已是操作系统一部分如何解决

    有位用户因为工作需求,所以想在win10系统电脑中安装microsoft .net framework 4.0.可是在安装过程中却失败了,还遇到提示"Microsoft.net framew ...

  10. C#设计模式——命令模式(Command Pattern)

    一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...