JSON

1.什么是JSON
JSON是指JavaScript对象表示法([color=red][b]J[/b][/color]ava[color=red][b]S[/b][/color]cript [color=red][b]O[/b][/color]bject [color=red][b]N[/b][/color]otation)。
JSON是轻量级的文本数据交换格式。
JSON独立于语言。
JSON具有自我描述性(即人可读懂)。
JSON具有层级机构(即值仍然可以是对象)。
JSON使用JavaScript语法描述数据对象,但是JSON独立于语言和平台。

2.JSON vs. XML
1)JSON更短。JSON通常用于客户端与服务器端数据交互,数据更短的话通过网络交互流量更小,就会更省时。
2)JSON更快。使用XML需要通过DOM来遍历整个XML文档,而使用JSON的话速度会更快。
两者的性能比较代码,用Gson解析JSON,用DOM4J解析XML。
public class PerformanceMain {
public static int COUNT = 10000;
public static void main(String[] args) throws Exception{
long startTime = System.currentTimeMillis();
for(int i =0;i<COUNT;i++)
readXml2Bean();
System.out.println(System.currentTimeMillis() - startTime);
}
private static void readJson2Bean() throws Exception{
String json = " {\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"}";
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
}
private static void readXml2Bean() throws Exception{
String xml = "<root>\n" +
"<name>frank1234</name>\n" +
"<address>\n" +
"\t<city>北京市</city>\n" +
"\t<street>海淀</street>\n" +
"\t<postcode>220000</postcode>\n" +
"</address>\n" +
"</root>";
SAXReader reader = new SAXReader();
Document doc = null;
InputStream in = new ByteArrayInputStream(xml.getBytes("UTF-8"));
try {
doc = reader.read(in);
} catch (Exception e) {
e.printStackTrace();
}
Element root = doc.getRootElement();
Element name = root.element("name");
Element address = root.element("address");
Element city = address.element("city");
Element street = address.element("street");
Element postcode = address.element("postcode");
}
}
运行结果:
XML解析方式:耗时2873ms
JSON解析方式:耗时483ms
可见两者的速度差异还是很大的。

3.JSON数据格式
3.1.JSON取值
1)数字(整数或者浮点数)
2)字符串(在双引号中)
3)逻辑值(true或者false)
3)数组(在方括号中)
4)对象(在花括号中)
5)null
整数、逻辑值还有null,均不能放在""中,否则就变成了字符串值了。

3.2.JSON语法规则
1)数据在名称/值对中。
2)数据由逗号分隔
3)花括号保存对象
4)方括号保存数组

3.3.示例
1)单值
"city":"北京市"
2)对象
{"city":"北京市","street":"海淀","postcode":220000}
3)复杂对象
{"name":"frank1234","address":{"city":"北京市","street":"海淀","postcode":220000}}
下面的示例程序均以这个JSON对象为例。
4)数组
[{"name":"frank1234","address":{"city":"北京市","street":"海淀","postcode":220000}},{"name":"Obama","address":{"city":"New York","street":"Wall Street","postcode":11111111}}]

4.JavaScript处理JSON
<html>
<body>
<h2>在 JavaScript 中创建 JSON 对象</h2>


Name: <span id="name"></span>

Address: <span id="address"></span>


Name Array[1]: <span id="namearray"></span>

Address Array[1]: <span id="addressarray"></span>


<script type="text/javascript">
var JSONObject= {"name":"frank1234","address":{"city":"北京市","street":"海淀","postcode":220000}};
document.getElementById("name").innerHTML=[color=red][b]JSONObject.name[/b][/color]
document.getElementById("address").innerHTML=JSONObject.address.city +":" +JSONObject.address.street+ ":"+JSONObject.address.postcode


var JSONObjectArray = [{"name":"frank1234","address":{"city":"北京市","street":"海淀","postcode":220000}},{"name":"Obama","address":{"city":"New York","street":"Wall Street","postcode":11111111}}];
document.getElementById("namearray").innerHTML=JSONObjectArray[1].name
document.getElementById("addressarray").innerHTML=[color=red][b]JSONObjectArray[1].address.city[/b][/color] +":" +JSONObjectArray[1].address.street+ ":"+JSONObjectArray[1].address.postcode

</script>

</body>
</html>

5.Servlet返回JSON

response.setContentType("application/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.write(json);
pw.flush();

6.服务器端json解析
6.1.jackson
需要引入jackson-all-1.6.4.jar
public class JacksonMain {
private static JsonGenerator jsonGenerator = null;
private static ObjectMapper objectMapper = null;
private static void init() throws Exception{
objectMapper = new ObjectMapper();
jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);
}
private static void close() throws Exception{
if (jsonGenerator != null) {
jsonGenerator.flush();
}
if (!jsonGenerator.isClosed()) {
jsonGenerator.close();
}
jsonGenerator = null;
objectMapper = null;
}
public static void main(String[] args) throws Exception{
init();
// writeBean2Json();
// writeList2Json();
// readJson2Bean();
readJson2List();
close();
}
private static void writeBean2Json() throws Exception{
Address address = new Address();
address.setCity("北京市");
address.setStreet("海淀");
address.setPostcode(220000);
Person person = new Person();
person.setName("frank1234");
person.setAddress(address);
jsonGenerator.writeObject(address);
System.out.println();
jsonGenerator.writeObject(person);
System.out.println();
}
private static void writeList2Json() throws Exception{
Address address1 = new Address();
address1.setCity("北京市");
address1.setStreet("海淀");
address1.setPostcode(220000);
Person person1 = new Person();
person1.setName("frank1234");
person1.setAddress(address1);
List<Person> list = new ArrayList<Person>();
list.add(person1);

Address address2 = new Address();
address2.setCity("New York");
address2.setStreet("Wall Street");
address2.setPostcode(11111111);
Person person2 = new Person();
person2.setName("Obama");
person2.setAddress(address2);
list.add(person2);
jsonGenerator.writeObject(list);

System.out.println();
}
private static void readJson2Bean() throws Exception{
String json = " {\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"}";
Person person = objectMapper.readValue(json, Person.class);
System.out.println(person);
}
private static void readJson2List() throws Exception{
String json = " [{\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"},{\"address\":{\"city\":\"New York\",\"street\":\"Wall Street\",\"postcode\":11111111},\"name\":\"Obama\"}]";
Person[] persons = objectMapper.readValue(json, Person[].class);
List<Person> list = new ArrayList<Person>();
for (int i = 0; i < persons.length; i++) {
Person person = persons[i];
System.out.println(person);
list.add(person);
}
}
}


6.2.jsonlib
需要引入:
commons-beanutils.jar
commons-collections.jar
commons-lang.jar
commons-logging.jar
ezmorph-1.0.6.jar
json-lib-2.4-jdk15.jar

public class JsonlibMain {
public static void main(String[] args) throws Exception{
// writeBean2Json();
// writeList2Json();
// readJson2Bean();
readJson2List();
}
private static void writeBean2Json() throws Exception{
Address address = new Address();
address.setCity("北京市");
address.setStreet("海淀");
address.setPostcode(220000);
Person person = new Person();
person.setName("frank1234");
person.setAddress(address);
System.out.println(JSONObject.fromObject(address));
System.out.println(JSONSerializer.toJSON(person));

}
private static void writeList2Json() throws Exception{
Address address1 = new Address();
address1.setCity("北京市");
address1.setStreet("海淀");
address1.setPostcode(220000);
Person person1 = new Person();
person1.setName("frank1234");
person1.setAddress(address1);
List<Person> list = new ArrayList<Person>();
list.add(person1);

Address address2 = new Address();
address2.setCity("New York");
address2.setStreet("Wall Street");
address2.setPostcode(11111111);
Person person2 = new Person();
person2.setName("Obama");
person2.setAddress(address2);
list.add(person2);
System.out.println(JSONArray.fromObject(list));
}
private static void readJson2Bean() throws Exception{
String json = " {\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"}";
Person person = (Person)JSONObject.toBean(JSONObject.fromObject(json),Person.class);
System.out.println(person);
}
private static void readJson2List() throws Exception{
String json = " [{\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"},{\"address\":{\"city\":\"New York\",\"street\":\"Wall Street\",\"postcode\":11111111},\"name\":\"Obama\"}]";
List<Person> list = JSONArray.toList(JSONArray.fromObject(json), Person.class);
for (int i = 0; i < list.size(); i++) {
Person person = list.get(i);
System.out.println(person);
}
}
}


6.3.Gson
需要引入:gson-2.1.jar
public class GsonMain {
public static void main(String[] args) throws Exception{
// writeBean2Json();
writeList2Json();
//readXml2Bean();


// readJson2List();
}
private static void writeBean2Json() throws Exception{
Address address = new Address();
address.setCity("北京市");
address.setStreet("海淀");
address.setPostcode(220000);
Person person = new Person();
person.setName("frank1234");
person.setAddress(address);
Gson gson = new Gson();
System.out.println(gson.toJson(address));
System.out.println(gson.toJson(person));
}
private static void writeList2Json() throws Exception{
Address address1 = new Address();
address1.setCity("北京市");
address1.setStreet("海淀");
address1.setPostcode(220000);
Person person1 = new Person();
person1.setName("frank1234");
person1.setAddress(address1);
List<Person> list = new ArrayList<Person>();
list.add(person1);

Address address2 = new Address();
address2.setCity("New York");
address2.setStreet("Wall Street");
address2.setPostcode(11111111);
Person person2 = new Person();
person2.setName("Obama");
person2.setAddress(address2);
list.add(person2);
Gson gson = new Gson();

System.out.println(gson.toJson(list));
}
private static void readJson2Bean() throws Exception{
String json = " {\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"}";
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println(person);
}

private static void readJson2List() throws Exception{
String json = " [{\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"},{\"address\":{\"city\":\"New York\",\"street\":\"Wall Street\",\"postcode\":11111111},\"name\":\"Obama\"}]";
Gson gson = new Gson();
Person[] persons = gson.fromJson(json,Person[].class);
List<Person> list = new ArrayList<Person>();
for (int i = 0; i < persons.length; i++) {
Person person = persons[i];
System.out.println(person);
list.add(person);
}
}
}


笔者最喜欢Gson的处理方式,简洁清晰。


7.参考资料
http://www.ibm.com/developerworks/cn/web/wa-lo-json/
http://www.cnblogs.com/worfdream/articles/1956449.html
http://fjg0427.iteye.com/blog/1840074
http://www.w3school.com.cn/json/index.asp
http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html
http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值