struts+json
tips:注意 struts.xml配置, json-default 及引入 struts2-json-plugin-2.1.8.1.jar 包
1、json基础知识
JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式。同时,JSON是Javascript原生格式,这意 味着在javascript中处理JSON数据不需要任何特殊的API或工具包,而且效率非常高。
JSON的结构如下:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)
一个标准的json格式:
{"name":"jifeng","company":"taobao"}
2.json的解析
json的解析方法共有两种:1. eval() ; 2.JSON.parse() ; 3.evalJSON()。具体使用方法如下:
var jsonstr = ‘{"name":"jifeng","company":"taobao"}‘; //eval function var evalJson = eval(‘(‘ + jsonstr + ‘)‘); // JSON.parse function var JSONParseJson = JSON.parse(jsonstr); //这个引入property.js var obj = jsonstr.evalJSON();
3.struts2的json响应的param类型 param name=" XX "
root:只包含xx对象excludeProperties :除了xx之外的集合includeProperties : 包含xx的集合 wrapPrefix :json结果开头添加xx(比如<paramname="wrapPrefix">[</param>) wrapSuffix :同上,只不过是结尾 ignoreHierarchy :转化时是否忽略继承关系true/false enumAsBean : 是否将枚举当做一个bean处理 enableGZIP :是否支持gzip压缩输出 noCache :是否缓存 excludeNullProperties : 是否转化输出 null值 statusCode :设置响应代号比如 304 callbackParameter : JSONP跨域访问的回调设置 contentType : 输出类型
4.fastjson 实例
实体类:
package com.pxj.fastjson.entity; public class Student { private int id; private String name; private int age; /** * 默认的构造方法必须不能省,不然不能解析 */ public Student(){ } public Student(int id,String name,int age) { this.id = id; this.name = name; this.age = age; } 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
package com.pxj.fastjson.entity; import java.util.List; public class Teacher { private int id; private String name; private List<Student> students; /** * 默认的构造方法必须不能省,不然不能解析 */ public Teacher() { } public Teacher(int id,String name) { this.id = id; this.name = name; } 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 List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } @Override public String toString() { return "Teacher [id=" + id + ", name=" + name + ", mStudents=" + students + "]"; } }
测试类:
package com.pxj.fastjson.demo; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.serializer.SimplePropertyPreFilter; import com.pxj.fastjson.entity.Student; import com.pxj.fastjson.entity.Teacher; public class Demo { @Test public void test1() { Student student = new Student(0, "Aaron", 24); System.out.println(JSON.toJSONString(student)); } //{"age":24,"id":0,"name":"Aaron"} @Test public void test2() { List<Student> students = new ArrayList<Student>(); for (int i = 0; i < 5; i++) { Student stu = new Student(i, "Student" + i, 18 + i); students.add(stu); } System.out.println(JSON.toJSONString(students)); } @Test public void test3() { List<Teacher> teaList = new ArrayList<Teacher>(); for (int i = 0; i < 10; i++) { Teacher teacher = new Teacher(i, "Teacher " + i); List<Student> stus = new ArrayList<Student>(); for (int j = 0; j < 4; j++) { Student s = new Student(j, "Student" + j, 18 + j); stus.add(s); } teacher.setStudents(stus); teaList.add(teacher); } String jsonTeach = JSON.toJSONString(teaList); System.out.println("fastjson = " + jsonTeach); } // 按照标准的json 格式输出 @Test public void test4() { Student student = new Student(0, "Aaron", 24); System.out.println(JSON.toJSONString(student, true)); } // 实体类中的某个字段或某几个不进行解析呢 @Test public void test5() { List<Student> students = new ArrayList<Student>(); for (int i = 0; i < 5; i++) { Student stu = new Student(i, "Student" + i, 18 + i); students.add(stu); } SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Student.class, "id", "age"); String jsonStu = JSON.toJSONString(students, filter); System.out.println(jsonStu); } //反序列化主要使用的是JSON.parseObject(str,class); 它就能把我们的str 转化为class 类型的对象,当然还有更复杂的对象 @Test public void test6() { List<Student> students = new ArrayList<Student>(); for (int i = 0; i < 5; i++) { Student stu = new Student(i, "Student" + i, 18 + i); students.add(stu); } String jsonStu = JSON.toJSONString(students); List<Student> stu =JSON.parseObject(jsonStu, new TypeReference<List<Student>>(){}); for(int i=0;i<stu.size();i++) { System.out.println(stu.get(i)); } } }
5. struts+json实例
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>获取</title> <script type="text/javascript" src="js/jquery-1.4.3.js"> </script> <script type="text/javascript"> function loadInfo() { $("#info").load("loadInfo"); } </script> </head> <body> <input type="button" value="获取" id="btnGet" onclick="loadInfo()" /> <div id="info"></div> </body> </html>
comment.java
package com.pxj.entity; public class Comment { private long id; private String nickname; private String content; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
InfoAction.java
package com.pxj.action; import java.util.ArrayList; import java.util.List; import org.apache.struts2.json.annotations.JSON; import com.pxj.entity.Comment; public class InfoAction { private static final long serialVersionUID = 1359090410097337654L; private List<Comment> comments = new ArrayList<Comment>(); //没getter and setter方法的属性不会被串行化到JSON @SuppressWarnings("unused") private String title; //!!!使用transient修饰的属性也会被串行化到JSON private transient String content; public String loadInfo() { title="123木头人"; content="你是木头人,哈哈。"; loadComments(); return "success"; } /** * 加载留言信息 */ private void loadComments() { Comment com1 = new Comment(); com1.setContent("很不错嘛"); com1.setId(1); com1.setNickname("纳尼"); Comment com2 = new Comment(); com2.setContent("哟西哟西"); com2.setId(2); com2.setNickname("小强"); comments.add(com1); comments.add(com2); } //为了使content对象不被串行化到JSON,在不能舍弃其getter setter方法的时候,我们可以这样在content的getter方法上面加上注解:@JSON(serialize=false) @JSON(serialize=false) public List<Comment> getComments() { return comments; } public void setComments(List<Comment> comments) { this.comments = comments; } public static long getSerialversionuid() { return serialVersionUID; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="default" namespace="/" extends="json-default"> <action name="loadInfo" class="com.pxj.action.InfoAction" method="loadInfo"> <result name="success" type="json"></result> </action> </struts>
时间: 2024-10-25 09:30:08