Json大量字段案例(300多个key),需要做一个客户中心抽调各个系统的客户信息的功能,在每个系统中需要写客户端代码,在客户中心系统需要写服务端代码。

客户端:

json串截图如下,注意在json结构中有对象也有数组也就是集合。在java类和json对象的互相转换过程中,如果将json串转换成java类对象,在里层的特殊类型,也就是[]集合的,我们需要进行特殊的处理。
%title插图%num

1.创建线程:(向客户中心推送客户信息时,前提是不能影响本系统的流程,也就是说不管你借口中的方法是否报错借口是否通都不能影响源代码的正常秩序,因为我们新增了线程),内部类。

try {

Thread thread = new Thread(new Runnable() {

public void run() {

//次数写客户端调用接口的相关方法

}

});

thread.start();

} catch (Exception e) {

e.printStackTrace();

}

根据json的结构构建出对应的java类来。一层一层的写java类,查询出所有需要的信息赋值到java类对象中后,将对象转化成可以推送的json对象

JSONObject fromObject = JSONObject.fromObject(customerCenter,jsonExcludeEmpty());

private JsonConfig jsonExcludeEmpty(){//去除空的json键值对

JsonConfig jsonConfig = new JsonConfig();

jsonConfig.setJsonPropertyFilter(new PropertyFilter() {

@Override

public boolean apply(Object source, String name, Object value) {

return value == null;

}

});

return jsonConfig;

}

调用HTTP工具类推送信息调用接口,*后获得接口的返回值result.

同样在获取数据本系统做保存时,调用接口后获得返回值result

JSONObject jsonObject = JSONObject.fromObject(result);

String status = jsonObject.getString(“status”).trim();

//过滤掉不需要处理的json对象

JsonConfig  config=new JsonConfig ();

config.setExcludes(new String[]{“educationInfos”,”carInfo”,”houseInfo”});

JSONObject dataJSON = new JSONObject().fromObject(data,config);

//json转java对象特殊的类型需要单独处理,比如list [ ]中括号

Map<String, Class> classMap = new HashMap<String, Class>();

classMap.put(“phones”, CustomerCenterPhone.class);

classMap.put(“companyPhones”, CustomerCenterPhone.class);

classMap.put(“emails”, CustomerCenterEmail.class);

……………………..
CustomerCenter customerCenter =(CustomerCenter)JSONObject.toBean(dataJSON,CustomerCenter.class,classMap);

这样就获得到了*外层整体的对象CustomerCenter ,在这个对象中,我做的这个项目有300多个字段。里面的对象和集合还是比较多的,在做的时候要仔细的核对好。

服务端:

http服务端的代码一般不是在service类或是接口中写,而是直接写在controller中,因为是http的嘛,就和一个页面访问一样先进入到controller层,类的注解不变还是@Controller@RequestMapping(value=”/ApplicationController”)两个后面的是访问的名称。在方法上有了一些变化,先看下面的代码:
@RequestMapping(value=”/approveResult”,method = RequestMethod.POST)
public void approveResult(@RequestBody PharosResultPojo pharosResultPojo,HttpServletRequest request,HttpServletResponse response){
//PharosResultPojo 这个是接受数据的java类
//里面直接写相应的功能,在处理完后,需要给调用者返回处理的结果
PrintWriter out;
out = response.getWriter();
JSONObject result = new JSONObject();
result.put(“result”, “ok”);
out.write(result.toString());
out.flush();
out.close();
}
//我们看到在除了平时要使用的方法访问名称后,又加了个参数method = RequestMethod.POST,这个就是规定你http服务端的这个接口方法是post还是get方式。在方法参数列表中要加上这个注解@RequestBody 以及HttpServletRequest request,HttpServletResponse response两个参数。在controller中写了以上的内容后我们只需要完成*后一步http服务端就完成了。那么我们的java代码已经写好了,想要和页面上的一样访问到我们的后台,那我们还需要一个什么操作呢?既然是接口,那么一般肯定是其它的系统访问,我们知道的是自己系统的类其它类是不能直接去访问的,我们需要将这个类给取消拦截,也就是让其它系统可以访问,这一步是在配置文件中实现的,每个公司的项目的结构一般都不一样,有很多公司是在applicationContext-security.xml这个xml中配置,
<b:bean id=”resourceDetailsService”
class=”*********.security.ResourceDetailsServiceImp”>
<b:property name=”filterURL”>
<b:map>
<b:entry key=”/ApplicationController/**” value=”ROLE_ANONYMOUS” />
直接将这个类给取消拦截,具体的在xml中的写法,有一些是公司封装的比较详细,如果你做的项目什么都没有的话,那么你可以在网上搜索一下如何在spring mvc项目(我公司用的是spring mvc项目这个框架)中取消controller类的访问拦截,应该很简单的。