JSON格式:http://www.json.org/
python和JSON的关系请参考:http://docs.python.org/library/json.html
JSON建构有两种结构:
1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
2.值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
简单地说
,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
按照最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对":
{ "firstName": "Brett" }
这个示例非常基本,而且实际上比等效的纯文本"名称 / 值对"占用更多的空间:
firstName=Brett
但是,当将多个"名称 / 值对"串在一起时,JSON 就会体现出它的价值了。首先,可以创建包含多个"名称 / 值对"的 记录,比如:
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }
从语法方面来看,这与"名称 / 值对"相比并没有很大的优势,但是在这种情况下 JSON 更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分;花括号使这些值有了某种联系。
当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。例如,假设您希望表示一个人名列表。在 XML 中,需要许多开始标记和结束标记;如果使用典型的名称 / 值对(就像在本系列前面文章中看到的那种名称 / 值对),那么必须建立一种专有的数据格式,或者将键名称修改为 person1-firstName这样的形式。
如果使用 JSON,就只需将多个带花括号的记录分组在一起:
{ "people": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
]}
这不难理解。在这个示例中,只有一个名为 people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录):
{ "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": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
] }
这里最值得注意的是,能够表示多个值,每个值进而包含多个值。但是还应该注意,在不同的主条目(programmers、authors 和 musicians)之间,记录中实际的名称 / 值对可以不一样。JSON 是完全动态的,允许在 JSON 结构的中间改变表示数据的方式。
在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,甚至可以以不同方式表示同一事物。
-------------------------------------------------------------------------------------------------------------------------------
实际程序测试json格式:
Json数据格式测试结果:
测试结果1:{"Person":{"address":"香港","id":1001,"name":"刘德华"}}
测试结果2:{"persons":[{"address":"香港","id":1001,"name":"刘德华"},{"address":"韩国","id":1001,"name":"宋慧乔"}]}
测试结果3:{"persons":["美國","中國","俄羅斯"]}
测试结果4:{"persons":[{"id":1001,"address":"香港","name":"刘德华"},{"id":1002,"address":"韩国","name":"宋慧乔"}]}
Person.java
package com.json.data;
public class Person {
private int id;
private String name;
private String address;
public Person() {
// TODO Auto-generated constructor stub
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Person(int id, String name, String address) {
super();
this.id = id;
this.name = name;
this.address = address;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", address=" + address
+ "]";
}
}
JsonService.java
package com.json.service;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import com.json.data.Person;
public class JsonService {
public JsonService() {
// TODO Auto-generated constructor stub
}
public static Person getPerson() {
Person person = new Person(1001, "刘德华", "香港");
return person;
}
public static List<Person> getListPersons() {
List<Person> persons = new ArrayList<Person>();
Person person1 = new Person(1001, "刘德华", "香港");
Person person2 = new Person(1001, "宋慧乔", "韩国");
persons.add(person1);
persons.add(person2);
return persons;
}
public static List<String> getListString(){
List<String> list = new ArrayList<String>();
list.add("美國");
list.add("中國");
list.add("俄羅斯");
return list;
}
public static List<java.util.Map<String, Object>> getListMap(){
List<java.util.Map<String, Object>> list = new ArrayList<Map<String,Object>>();
java.util.Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("id",1001);
map1.put("name","刘德华");
map1.put("address","香港");
java.util.Map<String,Object> map2 = new HashMap<String,Object>();
map2.put("id",1002);
map2.put("name","宋慧乔");
map2.put("address","韩国");
list.add(map1);
list.add(map2);
return list;
}
}
JsonTools.java (创建Json格式的数据)
package com.json.tools;
import net.sf.json.JSONObject;
public class JsonTools {
/**
* @param key 表示json字符串的头信息
* @param value 表示解析几何的类型
* @return
*/
public static String creatJsonString(String key, Object value) {
JSONObject jsonObject = new JSONObject();
jsonObject.put(key, value);
return jsonObject.toString();
}
}
TestJson.java
package com.json.test;
import com.json.service.JsonService;
import com.json.tools.JsonTools;
public class TestJson {
public TestJson() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//Test1
System.out.println("Json数据格式测试结果:\n");
String jsonString1 = JsonTools.creatJsonString("Person", JsonService.getPerson());
//Test2
String jsonString2 = JsonTools.creatJsonString("persons", JsonService.getListPersons());
//Test3
String jsonString3 = JsonTools.creatJsonString("persons",JsonService.getListString());
//Test 4
String jsonString4 = JsonTools.creatJsonString("persons",JsonService.getListMap());
System.out.println("测试结果1:"+jsonString1+"\n");
System.out.println("测试结果2:"+jsonString2+"\n");
System.out.println("测试结果3:"+jsonString3+"\n");
System.out.println("测试结果4:"+jsonString4);
}
}
package com.json.action;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.json.service.JsonService;
import com.json.tools.JsonTools;
public class JsonAction extends HttpServlet {
JsonService jsonService ;
/**
* Constructor of the object.
*/
public JsonAction() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
// 获取 person的 list , 保存为json数据
String jsonString = JsonTools.creatJsonString("persons", jsonService.getListPersons());
out.println(jsonString);
out.flush();
out.close();
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
jsonService = new JsonService();
}
}
原文:http://blog.csdn.net/neu_yousei/article/details/22881585