JSON简介

来源:互联网 发布:淘宝数据怎么分析 编辑:程序博客网 时间:2024/05/22 03:47
//1,JSON指JavaScript对象表示法(JavaScript Object Notation),是一种轻量级的文本数据交换格式,类似于XML,但比XML更小,更快,更易于解析。JSON是基于JavaScript的一个子集,它使用JavaScript//语法来描述数据对象,但是JSON仍独立于语言和平台。JSON解析器和JSON库支持许多不同的变成语言。这些特性都使得JSON成为理想的数据交换语言,使其易于人们的阅读和编写,同时也易于//机器解析和生成。//2,数据格式简单,易于读写,格式是压缩的,占用带宽小。易于解析语言,客户端JavaScript可以简单的通过eval()进行JSON数据的读取。支持多种语言,包括ActionScript、C、C#、ColdFusion、//Java、JavaScript、Perl、PHP、Python、Ruby等服务器端语言,便于服务器端的解析。众多服务器端的对象、数组等能够直接生成JSON格式、便于客户端的访问读取。因为JSON格式能够直接为服务器//端代码使用,大大简化了服务器端和客户端的代码开发量,但是完成的任务不变,且易于维护//3,“名称/值”对的集合形式又成为JSON Object,其名称和值之间使用“:”隔开,如下:{name:value},例如:{"Width":"800","Height":"600"}//其中名称是字符串,值可以是字符串,数值,对象,布尔值,有序列表或者null值,字符串是以""括起来的一串字符;数值是一系列0~9的数值组合,可以是小数或者负数,还可以用E或者e表示为指数//形式;布尔值表示为true或者false。"名称/值"对(每个"名称/值"对之间使用","分割。不同的语言中,这种"名称/值"可以理解为对象(object)、记录(record)、结构(struct)、字典(directory)、//哈希表(hash table)、有键列表(keylist)或者关联数组(associative array)等//4,值得序列表形式 又称为JSON arrray.在大部分语言中,值得有序列表被理解为数组,一个或者多个值用“,”分割后,使用"["和“]”括起来就形成了这样的列表,如:[collection,collection]{"employees":{{"Width":"800","Height":"600"},{"Width":"700","Height":"800"},{"Width":"900","Height":"900"}}}//5,JSON数据解析//首先,明确待解析的是JSON Object,还是JSON aray,然后再解析//第一,下面,lili是name的值{"name":"Lili"}//JSONObject.getString("String")方法可以得到JSON对象中String名称对应的值。下面是对上面JSON对象的解析方法//新建JSONObject,jsonString字符串中为上面的JSON对象的文本JSONObject demoJson=new JSONObject(jsonString);//获取name名称对应的值String s=demoJson.getString("name");//第二,下面两个名值对,中间使用","隔开,文本如下:{"name1":"android","name2":"iphone"}//上面的JSON对象的解析方法如下//新建JSONObject对象,将jsonString字符串转换为JSONObject对象//jsonString字符串中为上面的JSON对象的文本JSONObject demoJson=new JSONObject(jsonString);//获取name1对应的值String name1=demoJson.getString("name1");//获取name2对应的值String name2=demoJson.getString("name2");//第三,解析JSON array,下面是一个简单的JSON Array,number为数组名称,[1,2,3]为数组的内容,其JSON文本表示如下:{"number":[1,2,3]}//上面的JSON Array的解析方法如下://新建JSONObject对象,将jsonString字符串转换为JSONObject对象//jsonString字符串中为上面的JSON数组的文本JSONObject demoJson=new JSONObject(jsonString);//获取number对应的数组JSONArray numberList=demoJson.getJSONArray("number");//分别获取numberList中德每个值for(int i=0;i<numberList.length();i++){//因为数组中的类型为int,所以为getInt,其他getString,getLong具有类似的用法System.out.println(numberList.getInt());}//4,解析JSON Object和JSON Array混合对象,下面是一个JSON Object和JSON Array的混合文本,mobile为JSON Object名称,其对应的值JSON Array,JSON Array中包含的对象为JSON Object,//其名称和值之间使用“:”隔开,如下:{"mobile":[{"name":"android"},{"name":"iphone"}]}//上面文本的解析方法如下://新建JSONObject对象,将jsonString字符串转换为JSONObject对象//jsonString字符串中为上面的JSON数组的文本JSONObject demoJson=new JSONObject(jsonString);//首先获取名为mobile的对象对应的值//该值为JSONArray,这里创建一个JSONArray对象JSONArray numberList=demoJson.getJSONArray("mobile");//依次取出JSONArray中的值for(int i=0;i<numberList.length();i++){//从第i个取出JSONArray中的值为JSON Object"名值对"//通过getString("name")获取对应的值System.out.println(numberList.getJSONObject(i).getString("name"));}//6,JSON打包,要想在客户端通过JSON传送对象,需要在JSON把信息全部打包之后将JSONObject转换为String,这样JSON就会将 打包 的信息按照待定标准进行 压缩,之后在服务端//进行解析,读取通过JSON传来的信息//Android提供的JSON解析类都在包org.json下,主要有以下几个:一,JSONObject:可以看作一个JSON对象,这是系统中有关JSON定义的基本单元,即前面提到的 名值对//二,JSONStringer:JSON文本构建集,这个类可以帮助快速和方便的创建JSON文本,其最大的优点在于可以减少由于格式的错误导致的程序的异常,引用这个类可以自动严格按照JSON语法规则//创建JSON文本,每个JSONStringer实体只能对应创建一个JSON文本//JSONArray:他代表一组有序的数值,将其转换为String输出(toString)所表现的形式使用方括号包裹,数值以‘逗号’分割,即前面提到的指的有序列表//JSONTokener:JSON解析类//JSONExeception:JSON中涉及的异常//下面一个JSONObject、JSONArray来构建JSON文本的例子,其需要构建的文本如下:{"Strings":{"String1":"MyStrings","String2":"MyStrings"},"Number":{"987654321","123456789","456789123"},"String":"good","Int":100,"Boolean":false}//上面的JSON对象包含了5个 名值对 ,其中名称为Strings的对应的值本身也是一个包含2个名值对的JSON对象;名称为Number的对应的值为一个JSONArray;名称为String的对应的值为一个字符串//名称为Int的对应的值为一个整型;名称为Boolean的对应的值为布尔型//构建上述文本的主要代码如下:try{//创建JSONObject对象JSONObject mJSONObject=new JSONObject();//为String创建JSONObject对象JSONObject Strings=new JSONObject();//为Strings JSONObject对象添加一个名值对Strings.put("Strings1","MyStrings");//为Strings JSONObject对象添加第二个 名值 对Strings.put("String2","MyStrings");//将Strings添加到mJSONObject中mJSONObject.put("String2",Strings);//为Number创建JSONArray对象JSONArray Number=nwe JSONArray();//将有序表添加到Number中Number.put("987654321").put("123456789").put("456789123");//将Number添加到mJSONObject中mJSONObject.put("Number",number);//将Int 名值对 添加到mJSONObject中mJSONObject.put("Int",100);//将Boolean名值对 添加到mJSONObject中mJSONObject.put("Boolean",false);}catch(JSONException ex){//进行异常处理throw new RunTimeException(ex);}//七,JSON解析wikipeida内容Android Dome里面的simplewiktionary为例,其核心代码如下:--从wiki服务器获取相关页面信息protected static synchronized String getUrlContent(String url)throws ApiException{--检查是否设置了UserAgent属性--*User Agent中文名为用户代理,简称UA--UserAgent是一个特殊字符串头。使得服务器能够识别客户端使用的操作系统及版本--CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等if(sUserAgent==null){--抛出自定义异常,提示没有设置UserAgent属性throw new ApiException("User-Agent string must be prepared");}--新建HttpClient对象HttpClient client=new DefaultHttpClient();--新建HttpGet对象HttpGet request=new HttpGet(url);--添加用户代理request.setHeader("User-Agent",sUserAgent);try{--打开连接,获取返回信息HttpResponse response=client.execute(request);--检测服务器是否可用StatusLine status=response.getStatusLine();--检测服务器返回的状态码if(status.getStatusCode()!=HTTP_STATUS_OK){--如果服务器状态码返回不正常,这里就抛出自定义异常throw new ApiException("Invalid response from server:"+status.toString());--取回服务器返回的内容HttpEntity entity=response.getEntity();--将返回的内容保存到InputStream对象中InputStream inputStream=entity.getContent();--创建ByteArrayOutputStream对象--ByteArrayOutputStream捕获内存缓存中的数据--然后将其转换为字节数或者字符型ByteArrayOutputStream content=new ByteArrayOutputStream();int readBytes=0;--将缓存中的数据保存到ByteArrayOutputStream对象中while((readBytes=inputStream.read(sBuffer))!=-1){content.write(sBuffer,0,readBytes);}--将内容转化为字符串return new String(content.toByteArray());}catch(IOException e){--检测到IO异常的时候,抛出自定义的异常throw new ApiException("API返回错误",e);}}--检查错误,自定义异常public static class ApiException extends Exception{--含有2个参数的构造函数public ApiException(String detailMessage,Throwable throwable){super(detailMessage,throwable);}--含有一个参数的构造函数public ApiException(String detailMessage){super(detailMessage);}}}--下面的代码调用了上文定义的getUrlContent方法,解析本节开头的那段JSON信息/*@param title Wikitionary页面返回的标题@param expandTemplates设置模版是否可用*/--返回解析之前的页面内容public static String getPageContent(String title,boolean expandTemplates)throws ApiException,ParseException{--如有需要对标题和模版进行编码String encodedTitle=Uri.encode(title);String expandClause=expandTemplates?WIKTIONARY_EXPAND_TEMPLATES:"";--获取API内容String content=getUrlContent(String.format(WIKTIONARY_PAGE,encodedTitle,expandClause));try{--解析返回的JSON内容JSONObject response=new JSONObject(content);--获取query对应的JSON对象JSONObject query=response.getJSONObject("query");--获取pages对应的JSON对象JSONObject pages=query.getJSONObject("apges");--获取page对应的JSON对象JSONObject page=pages.getJSONObject((String)pages.keys().next());--获取revision对应得JSON数组JSONArray revisions=page.getJSONArray("revisions");--获取revision JSON对象,为revisions对应的JSON数组包含的第一个JSON对象JSONObject revision=revision.getJSONObject(0);--获取revision JSON对象的值return revision.getString("*");}catch(JSONException e){--错误处理throw new ParseException("API返回错误",e);}}
摘自<深入理解Android网络编程>
0 0