实例自己想的一个实例应用场景:一个人可以有多个角色,例如:在家中是儿子,在学校是学生,在公司是程序员,一个人还可以办好多业务
* 每个业务好多个人都可以办,则标记(mark)就是记录这唯一标识的(如id)业务和称职
1.人实体类(People)
package com.hsinfo.web.Demo;import java.util.Set;/** * @Description:人的实体类 * @date 2018年7月22日,下午8:58:03 */public class People { ???????//说明信息 ???private String message; ???//每个人所扮演角色的唯一标记 ???private Set<String> markSet; ???????public Set<String> getMarkSet() { ???????return markSet; ???} ???public void setMarkSet(Set<String> markSet) { ???????this.markSet = markSet; ???} ???public String getMessage() { ???????return message; ???} ???public void setMessage(String message) { ???????this.message = message; ???}}
2.角色实体类(Role)
package com.hsinfo.web.Demo;/** * @Description:角色实体类 * @date 2018年7月22日,下午8:57:37 */public class Role { ???????private String mark; ???????private String name; ???????private int age; ???????private String sex; ???????public String getMark() { ???????return mark; ???} ???public void setMark(String mark) { ???????this.mark = mark; ???} ???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; ???} ???public String getSex() { ???????return sex; ???} ???public void setSex(String sex) { ???????this.sex = sex; ???}}
3.service业务逻辑处理接口
package com.hsinfo.web.Demo;import net.sf.json.JSONObject;public interface JsonDemoService { ???????/** ????* ?????* @Description: json给前台输出排序后的数据 ????* @param @return ????* @param @throws Exception ?????* @return JSONObject ????* @throws ????*/ ???public JSONObject jsonSort(int roleCount ,int peopleCount ,int markCount) throws Exception;}
4.service业务逻辑处理实现类
package com.hsinfo.web.Demo;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import net.sf.json.JSONArray;import net.sf.json.JSONObject;/** * ?* @Description: * @date 2018年7月21日,上午12:27:32 */@Service@Transactionalpublic class JsonDemoServiceImpl implements JsonDemoService { ???/** ????* ?????* @Description: 排序后打印出json规定格式 ????* @param @return ????* @param @throws Exception ?????* @throws ????*/ ???@Override ???public JSONObject jsonSort(int roleCount ,int peopleCount ,int markCount) throws Exception { ???????List<Role> roleList = SimulationData.dataRole(roleCount); ???????List<People> peopleList = SimulationData.dataPeople(peopleCount, markCount); ???????JSONObject returnJson = jsonStudy(peopleList,roleList); ???????return returnJson; ???} ???/** ????* ?????* @Description: 实战使用,根据mark找People的相关Role且使用Json格式打印(可排序也可不排序) ????* 重点:学习JSONObject与JSONArray的使用(Json转对象,对象转Json) ????* @param @param peopleList ????* @param @param userList ????* @param @return ?????* @return JSONObject ????* @throws ????*/ ???private JSONObject jsonStudy(List<People> peopleList, List<Role> roleList) { ???????long start = System.currentTimeMillis(); ???????JSONObject returnJson = new JSONObject(); ???????JSONArray peopleJsonArray = new JSONArray(); ???????for (People people : peopleList) { ???????????//每个人的标记集合 ???????????Set<String> markSet = people.getMarkSet(); ???????????JSONObject propleJson = new JSONObject(); ???????????propleJson.put("description", "People数据信息如下:"); ???????????propleJson.put("message", people.getMessage()); ???????????JSONArray roleJsonArray = new JSONArray(); ???????????/**匹配每个人扮演的角色*/ ???????????for (String mark : markSet) { ???????????????for (Role role : roleList) { ???????????????????if (mark.equals(role.getMark())) { ???????????????????????JSONObject userDataJson = JSONObject.fromObject(role); ???????????????????????userDataJson.put("description", "添加的属性字段信息" + mark); ???????????????????????roleJsonArray.add(userDataJson); ???????????????????} ???????????????} ???????????} ???????????/**把JSONArray(roleJsonArray)转换为List对象*/ ???????????if (roleJsonArray.size() > 0) { ???????????????List<RoleJson> roleJonList = new ArrayList<RoleJson>(); ???????????????for (int i = 0; i < roleJsonArray.size(); i++) { ???????????????????JSONObject roleJson = (JSONObject) roleJsonArray.get(i); ???????????????????RoleJson roleJsonDate = new RoleJson(); ???????????????????roleJsonDate = (RoleJson) JSONObject.toBean(roleJson, RoleJson.class); ???????????????????roleJonList.add(roleJsonDate); ???????????????} ???????????????/**根据唯一标记(mark)进行角色排序*/ ???????????????Collections.sort(roleJonList, new Comparator<RoleJson>() { ???????????????????public int compare(RoleJson R1, RoleJson R2) { ???????????????????????return (R1.getMark()).compareTo(R2.getMark()); ???????????????????} ???????????????}); ???????????????propleJson.put("roleJonList", roleJonList); ???????????????peopleJsonArray.add(propleJson); ???????????} ???????} ???????/**多个人根据第一个标记进行排序输出*/ ???????if (peopleJsonArray.size() > 0) { ???????????List<PeopleJson> peopleJsonList = new ArrayList<PeopleJson>(); ???????????/**JSONArray(peopleDataJsonArray)转换为Map对象*/ ???????????for (int i = 0; i < peopleJsonArray.size(); i++) { ???????????????JSONObject pJsonObject = (JSONObject) peopleJsonArray.get(i); ???????????????PeopleJson peopleJson = new PeopleJson(); ???????????????Map<String, Class<RoleJson>> map = new HashMap<String, Class<RoleJson>>(); ???????????????map.put("roleJonList", RoleJson.class); ???????????????peopleJson = (PeopleJson) JSONObject.toBean(pJsonObject, PeopleJson.class, map); ???????????????peopleJsonList.add(peopleJson); ???????????} ???????????/**排序*/ ???????????Collections.sort(peopleJsonList, new Comparator<PeopleJson>() { ???????????????public int compare(PeopleJson R1, PeopleJson R2) { ???????????????????return R1.getRoleJonList().get(0).getMark().compareTo(R2.getRoleJonList().get(0).getMark()); ???????????????} ???????????}); ???????????peopleJsonArray.add(peopleJsonList); ???????????returnJson.put("peopleJsonArray", peopleJsonList); ???????} ???????long end = System.currentTimeMillis(); ???????System.out.println("处理数据时间:"+(end-start)); ???????return returnJson; ???}}
5.service业务处理json转换bean对象时,需要创建一个实体类,实体类属性与json节点key值保持一致(不然会出现Bug),也就是Json对象中保存的节点与需要转换为bean对象的实体类属性保持一致
5.1.PeopleJson
package com.hsinfo.web.Demo;import java.util.List;/** * @Description:JSONArray所存储的节点key值一致(必须与你所要输出的Json格式的节点一致,不然会报错) * 例: * ????"peopleDataJsonArray": [ ???????????{ ???????????????"description": "People数据信息如下:", ???????????????"message": "kgeGn", ???????????????"roleJonList": [ ???????????????????{ ???????????????????????"age": 87, ???????????????????????"description": "添加的属性字段信息0485833161", ???????????????????????"mark": "0485833161", ???????????????????????"name": "zXlMw", ???????????????????????"sex": "JQ" ???????????????????}, ???????????????] ???????????}, ???????] ????* @date 2018年7月22日,下午8:47:59 */public class PeopleJson { ???????private String description; ???private String message; ???????private List<RoleJson> roleJonList; ???????public String getMessage() { ???????return message; ???} ???public void setMessage(String message) { ???????this.message = message; ???} ???public String getDescription() { ???????return description; ???} ???public void setDescription(String description) { ???????this.description = description; ???} ???public List<RoleJson> getRoleJonList() { ???????return roleJonList; ???} ???public void setRoleJonList(List<RoleJson> roleJonList) { ???????this.roleJonList = roleJonList; ???}}
5.2.RoleJson
package com.hsinfo.web.Demo;/** * @Description: 作用和PeopleJson一样 * @date 2018年7月22日,下午8:53:52 */public class RoleJson { ???????private String mark; ???????private String name; ???????private int age; ???????private String sex; ???????//json输出需要这个节点且前台需要这个节点的值 ???private String description; ???????public String getDescription() { ???????return description; ???} ???public void setDescription(String description) { ???????this.description = description; ???} ???public String getMark() { ???????return mark; ???} ???public void setMark(String mark) { ???????this.mark = mark; ???} ???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; ???} ???public String getSex() { ???????return sex; ???} ???public void setSex(String sex) { ???????this.sex = sex; ???}}
6.模拟数据信息
package com.hsinfo.web.Demo;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Random;import java.util.Set;/** * @Description:模拟数据信息 * 一个人可以有多个角色,例如:在家中是儿子,在学校是学生,在公司是程序员,一个人还可以办好多业务 * 每个业务好多个人都可以办,则标记(mark)就是记录这唯一标识的(如id)业务和称职 * @date 2018年7月22日,下午2:26:52 */public class SimulationData { ???????// 保存用户账户的唯一标记 ???private static List<String> markLists = new ArrayList<String>(); ???/** ????* ?????* @Description: user模拟数据 ????* @param @param userCount user对象个数 ????* @param @return ?????* @return List<User> ????* @throws ????*/ ???public static List<Role> dataRole(int roleCount) { ???????long start = System.currentTimeMillis(); ???????System.out.println("/**********************《start添加User信息内容》********************/"); ???????List<Role> roleList = new ArrayList<Role>(); ???????for (int i = 1; i <= roleCount; i++) { ???????????Role role = new Role(); ???????????String mark = RandomDemo.getRandom(10, RandomDemo.TYPE.NUMBER); ???????????markLists.add(mark); ???????????role.setMark(mark); ???????????role.setName(RandomDemo.getRandom(5, RandomDemo.TYPE.LETTER_CAPITAL)); ???????????Integer age = Integer.parseInt(RandomDemo.getRandom(2, RandomDemo.TYPE.NUMBER)); ???????????role.setAge(age); ???????????role.setSex(RandomDemo.getRandom(2, RandomDemo.TYPE.LETTER_CAPITAL)); ???????????roleList.add(role); ???????} ???????for (int i = 0; i < roleList.size(); i++) { ???????????System.out.println("第" + (i + 1) + "组User数据"); ???????????System.out.print(" ?????" + "name:" + roleList.get(i).getName() + ",age:" + roleList.get(i).getAge() ???????????????????+ ",sex:" + roleList.get(i).getSex() + ",mark:" + roleList.get(i).getMark()); ???????????System.out.println(); ???????} ???????long end = System.currentTimeMillis(); ???????System.out.println("Role数据产生时间:"+(end-start)); ???????System.out.println("/**********************《end添加User信息内容》********************/"); ???????return roleList; ???} ???????/** ????* ?????* @Description: people模拟数据信息 ????* @param @param peopleCount people对象个数 ????* @param @param markCount 一个prople对应的标记个数 ????* @param @return ?????* @return List<People> ????* @throws ????*/ ???public static List<People> dataPeople(int peopleCount,int markCount) { ???????????????System.out.println("/**********************《start添加People信息内容》********************/"); ???????long start = System.currentTimeMillis(); ???????List<People> peopleList = new ArrayList<People>(); ???????for (int i = 1; i <= peopleCount; i++) { ???????????People people = new People(); ???????????people.setMessage(RandomDemo.getRandom(5, RandomDemo.TYPE.LETTER_CAPITAL)); ???????????// 去除重复的数字标记 ???????????Set<String> markSet = new HashSet<String>(); ???????????// 每个Prople类下有markCount个标记mark ???????????Random random = new Random(); ???????????for (int j = 1; j <= markCount; j++) { ???????????????int n = random.nextInt(markLists.size()); ???????????????markSet.add(markLists.get(n)); ???????????} ???????????people.setMarkSet(markSet); ???????????peopleList.add(people); ???????} ???????for (int i = 0; i < peopleList.size(); i++) { ???????????System.out.println("第" + (i + 1) + "组People数据"); ???????????System.out.print(" ?????mark标记列表" + peopleList.get(i).getMarkSet().toString() + ",message:"+ peopleList.get(i).getMessage()); ???????????System.out.println(); ???????} ???????long end = System.currentTimeMillis(); ???????System.out.println("People数据产生时间:"+(end-start)); ???????System.out.println("/**********************《end添加People信息内容》********************/"); ???????return peopleList; ???}}
7.随机产生数据源信息
package com.hsinfo.web.Demo;import java.util.ArrayList;import java.util.Arrays;import java.util.Random;/** * 字符随机生成类 */public class RandomDemo { ???/** ????* 随机产生类型枚举 ????*/ ???public static enum TYPE { ???????/**小字符型*/ ???????LETTER, ???????/**大写字符型*/ ???????CAPITAL, ???????/**数字型*/ ???????NUMBER, ???????/**大+小字符 型*/ ???????LETTER_CAPITAL, ???????/**小字符+数字 型*/ ???????LETTER_NUMBER, ???????/**大写字符+数字*/ ???????CAPITAL_NUMBER, ???????/**大+小字符+数字 型*/ ???????LETTER_CAPITAL_NUMBER, ???} ???private static String[] lowercase = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", ???????????"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" }; ???private static String[] capital = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", ???????????"Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; ???private static String[] number = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };// ???private static String[] number = { "1", "2", "3", "4", "5", "6", "7", "8", "9"}; ???/** ????* 静态随机数 ????*/ ???private static Random random = new Random(); ???/** ????* 获取随机组合码 ????* @param num 位数 ????* @param type 类型 ????* @type ?????* <br>小写字符型 LETTER, ????* <br>大写字符型 CAPITAL, ????* <br>数字型 NUMBER, ????* <br>大+小字符型 LETTER_CAPITAL, ????* <br>小字符+数字 型 LETTER_NUMBER, ????* <br>大字符+数字 型 CAPITAL_NUMBER, ????* <br>大+小字符+数字 型 LETTER_CAPITAL_NUMBER, ????*/ ???public static String getRandom(int num, TYPE type) { ???????ArrayList<String> temp = new ArrayList<String>(); ???????StringBuffer code = new StringBuffer(); ???????switch (type) { ???????case LETTER: ???????????temp.addAll(Arrays.asList(lowercase)); ???????????break; ???????case CAPITAL: ???????????temp.addAll(Arrays.asList(capital)); ???????????break; ???????case NUMBER: ???????????temp.addAll(Arrays.asList(number)); ???????????break; ???????case LETTER_CAPITAL: ???????????temp.addAll(Arrays.asList(lowercase)); ???????????temp.addAll(Arrays.asList(capital)); ???????????break; ???????case LETTER_NUMBER: ???????????temp.addAll(Arrays.asList(lowercase)); ???????????temp.addAll(Arrays.asList(number)); ???????????break; ???????case CAPITAL_NUMBER: ???????????temp.addAll(Arrays.asList(capital)); ???????????temp.addAll(Arrays.asList(number)); ???????????break; ???????case LETTER_CAPITAL_NUMBER: ???????????temp.addAll(Arrays.asList(lowercase)); ???????????temp.addAll(Arrays.asList(capital)); ???????????temp.addAll(Arrays.asList(number)); ???????????break; ???????} ???????for (int i = 0; i < num; i++) { ???????????code.append(temp.get(random.nextInt(temp.size()))); ???????} ???????return code.toString(); ???}// ???public static void main(String[] args) {// ???????System.out.println(RandomDemo.getRandom(10, RandomDemo.TYPE.LETTER_CAPITAL));// ???}}
8.Controller控制器
package com.hsinfo.web.Demo;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import net.sf.json.JSONObject;@Controller@RequestMapping("/testDemoAction")public class TestDemoAction { ???????@Autowired ???private JsonDemoService jsonDemoService; ???@RequestMapping(params = "peopleDate") ???@ResponseBody ???public JSONObject peopleDate(HttpServletRequest request){ ???????JSONObject returnJson = new JSONObject(); ???????Integer roleCount = Integer.parseInt(request.getParameter("roleCount")); ???????Integer peopleCount = Integer.parseInt(request.getParameter("peopleCount")); ???????Integer markCount = Integer.parseInt(request.getParameter("markCount")); ???????try { ???????????long start = System.currentTimeMillis(); ???????????JSONObject resultDate = jsonDemoService.jsonSort(roleCount, peopleCount, markCount); ???????????long end = System.currentTimeMillis();// ???????????System.out.println("运行时间:"+ (end-start)); ???????????returnJson.put("data", resultDate); ???????????returnJson.put("session", true); ???????????returnJson.put("msg", "请求数据接口成功"); ???????????returnJson.put("运行时间:", (end-start)); ???????} catch (Exception e) { ???????????e.printStackTrace(); ???????????returnJson.put("data", null); ???????????returnJson.put("session", false); ???????????returnJson.put("msg", "请求数据接口失败"); ???????} ???????return returnJson; ???}}
运行结果Json格式:由于每次运行随机产生的数据不定,所以每次运行数据都有不同
{ ???"msg": "请求数据接口成功", ???"resultDate": { ???????"peopleJsonArray": [ ???????????{ ???????????????"description": "People数据信息如下:", ???????????????"message": "ZrqDe", ???????????????"roleJonList": [ ???????????????????{ ???????????????????????"age": 81, ???????????????????????"description": "添加的属性字段信息0522150993", ???????????????????????"mark": "0522150993", ???????????????????????"name": "TmlCj", ???????????????????????"sex": "Gy" ???????????????????}, ???????????????????{ ???????????????????????"age": 64, ???????????????????????"description": "添加的属性字段信息5271761787", ???????????????????????"mark": "5271761787", ???????????????????????"name": "EySZq", ???????????????????????"sex": "Df" ???????????????????} ???????????????] ???????????}, ???????????{ ???????????????"description": "People数据信息如下:", ???????????????"message": "EEAUM", ???????????????"roleJonList": [ ???????????????????{ ???????????????????????"age": 45, ???????????????????????"description": "添加的属性字段信息6695587378", ???????????????????????"mark": "6695587378", ???????????????????????"name": "qYUyU", ???????????????????????"sex": "sI" ???????????????????}, ???????????????????{ ???????????????????????"age": 32, ???????????????????????"description": "添加的属性字段信息9386286052", ???????????????????????"mark": "9386286052", ???????????????????????"name": "HijbI", ???????????????????????"sex": "Va" ???????????????????} ???????????????] ???????????}, ???????????{ ???????????????"description": "People数据信息如下:", ???????????????"message": "WydtG", ???????????????"roleJonList": [ ???????????????????{ ???????????????????????"age": 45, ???????????????????????"description": "添加的属性字段信息6695587378", ???????????????????????"mark": "6695587378", ???????????????????????"name": "qYUyU", ???????????????????????"sex": "sI" ???????????????????} ???????????????] ???????????} ???????] ???}, ???"session": true}
总结:一般做web后台给前台处理后的数据大都是json格式,把数据以json的格式丢给前台,前台进行显示处理,渲染
JSONObject:用法与Map很类似,key,value,键值对
JSONArray:用法与数组类似,可以添加任何数据类型
net.sf.json JSONObject与JSONArray使用实例
原文地址:https://www.cnblogs.com/x-ll123/p/9352175.html