json(JavaScript object notation)是一种轻量级的数据交换格式。它是一种纯文本格式,不会受语言的限制。这里主要讲json在java中的封装与解析。
常用数据交换格式除了json之外当然还有xml,那么这两种格式到底有什么区别或者优略呢?
这里我参考了一下百度百科。总结一下大概分为五点:可读性,易拓展性,编码难度,解码难度,传输效率。下面逐一介绍:
可读性:就可读性而言,这两者难分胜负,一个是简易语法,一个是标准的结构化标记语言。这我看就是看个人习惯了,毕竟是萝卜白菜各有所爱。
易拓展性:这个也是难分伯仲,没有什么是xml可以而json不可的。
编码难度:两者都提供了很好的工具,只要放入相应的jar包那么方法的使用就不用多说了吧。看看上面的图片只要熟悉两者结构我想用代码来生成也不是什么特别难的事吧,毕竟都很有规律。
解码难度:如果预先知道结构,那么两者都不困难。如果不知道结构两者都不容易。
传输效率:我觉得这两者最大的区别就在传输效率上。可以参考上面的图片(直接盗的图,毕竟自己手敲太麻烦),这两张图片所要表达的内容是完全一样的,但是字符数量上json要明显优于xml。这就意味这如果要传输等量信息,xml要比json花费更多的流量。这就造成了xml与json在传输效率上的差距,要不怎么好意思叫轻量级呢。
上面对json做了一下简单介绍,下面回归正题:json解析。首先要讲解的是Android中自带的一种解析方式org.json包解析方式。这个包在android.jar中包含(版本太低可能会没有),当然这并不意味着这是Android专用的,可以专门下载org.json.jar并将它导入任意需要解析json的java工程。下面以我写的例子工程作为例子,为了尽量说清楚我把工程结构贴出来:
要说json解析首先要搞到json数据,我这里提供了两种方法,一种是从网络上开放的接口获取,我是从百度翻译接口获取这里仅仅是做演示所以我仅仅是用来API文档中给的示例地址。这种接口网上很多不必和我一样。第二种是自己模拟数据,我这里是从一个TXT文本文件中读取,数据来源是从百度百科上copy的。代码我直接贴了,代码写的很简单但是包括了常见的几种情况,注释已经很清楚了:
package com.demo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONObject;
public class JsonDecode {
public static void main (String[] arg0){
decodeJson(getJsonFromUrl("http://api.fanyi.baidu.com/api/trans/vip/translate"));
decodeJsonArray();
}
/**
* 用于自己创造json数据,用于测试
* @return
*/
public static JSONObject createJson(){
JSONObject jobj = new JSONObject();
jobj.put("test", "用于测试的数据");
jobj.put("data", "这是自己创造的测试数据");
System.out.println("---------------"+jobj);
return jobj;
}
/**
* json解析。
*/
public static void decodeJson(String jsonStr){
JSONObject jsonObj = new JSONObject(jsonStr);
String s = jsonObj.getString("error_code");
String ss = jsonObj.getString("error_msg");
System.out.println("解析出的数据为:" + s+"-----"+ss);
}
/**
* json中的数组形式
* 这里以直接从文件中读取为例
*/
public static void decodeJsonArray(){
String filePath = new File("jsonFile").getAbsolutePath();
InputStreamReader isr = null;
String sss = "";
try {
isr = new InputStreamReader(new FileInputStream(filePath+"\\json.txt"),"utf-8");
BufferedReader br = new BufferedReader(isr);
String line = "";
while((line=br.readLine())!=null){
sss += line;
}
isr.close();
System.out.println("-----------------"+sss.trim());
} catch (Exception e) {
e.printStackTrace();
}
JSONObject obj = new JSONObject(sss);
JSONArray array1 = obj.getJSONArray("programmers");
JSONArray array2 = obj.getJSONArray("musicians");
/**
* 下面可以写for循环这里不一一列举了。如何解析jsonobject上面已经说过。
*/
for(int i=0;i<array1.length();i++){
System.out.println("---"+array1.get(i));
}
}
/**
* 从网络获取json字符串。这里从百度翻译API提供的示例URL来获取json串
* 仅作为例子来参考,如果示例地址变更请自行寻找可用连接(网上很多的)
* "http://api.fanyi.baidu.com/api/trans/vip/translate";
* {"error_code":"52003","error_msg":"UNAUTHORIZED USER"}
*/
public static String getJsonFromUrl(String StrUrl){
String strJson = "";
URL url;
HttpURLConnection conn = null;
InputStreamReader is = null;
try {
url = new URL(StrUrl);
conn = (HttpURLConnection) url.openConnection();
is = new InputStreamReader(conn.getInputStream());
BufferedReader br = new BufferedReader(is);
String line = null;
while((line=br.readLine()) != null){
strJson += line;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
conn.disconnect();
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return strJson;
}
}
TXT文件中的内容自己随便从网上copy一段就可,这里就是练手嘛,对吧?
{
"programmers": [{
"firstName": "Brett",
"lastName": "McLaughlin",
"email": "aaaa"
},{
"firstName": "Jason",
"lastName": "Hunter",
"email": "bbbb"
},{
"firstName": "Elliotte",
"lastName": "Harold",
"email": "cccc"
}],
"authors": [{
"firstName": "Isaac",
"lastName": "Asimov",
"genre": "sciencefiction"
},{
"firstName": "Tad",
"lastName": "Williams",
"genre": "fantasy"
},{
"firstName": "Frank",
"lastName": "Peretti",
"genre": "christianfiction"
}],
"musicians": [{
"firstName": "Eric",
"lastName": "Clapton",
"instrument": "guitar"
},{
"firstName": "Sergei",
"lastName": "Rachmaninoff",
"instrument": "piano"
}]
}