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(); } }