@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

本文介绍了在Java中使用`@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)`注解进行JSON序列化优化,避免将null值写入JSON响应。通过三个不同示例展示了如何在直接创建JSON对象、使用ObjectMapper以及Spring MVC中应用该注解,以减少无效数据传输。
一:
  response.setContentType("text/html;charset=utf-8");
  ObjectMapper mapper=new ObjectMapper();
  JsonFactory factory=mapper.getJsonFactory();
  JsonGenerator jsonGenerator=factory.createJsonGenerator(response.getOutputStream());
  Map map=new HashMap();
  map.put("result", "1");
  jsonGenerator.writeObject(map);
二:JsonObject json=new JsonObject();
        json=JsonObject.fromJsonObject(object);
      response.setContentType("text/html;charset=utf-8");
      response.getWriter().write(json);

三:
spring MVC 3.X 支持注解,在需要序列化为json输出的类上增加@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
//@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class ActTerminalResultParam extends BaseFacadeAmountDepositTradeParam
implements Serializable{

注意:在类上注入此标志时,返回此类时,会返回set属性里的值
static int insert_cus ( struct dhcp_binding *res, /* pointer to lease descriptor */ ULONG lease, /* lease duration, in seconds */ int tagnum, /* tag value of option */ char *inserted, /* bitmap of inserted options */ char flag, /* if ACTIVE, marks non-default options */ DHCP_SERVER_POOL poolParam ) { char *option = NULL; int reqoptlen = 0; char *reqopt = NULL; int i = 0; UINT8 addOption[DHCPS_MAX_OPTION_LEN] = {0}; int ret = 0; //DHCP_SERVER_POOL pool; int j = 0; struct in_addr acAddr; UINT8 hasAcAdrr = 0; //memset(&pool, 0, sizeof(pool)); memset(addOption, 0, sizeof(addOption)); //swDhcpsPoolGet(res->poolName, &pool); //todo getbyname /* insert the requested options */ /* 在报文的option字段中,找到_DHCP_REQ_LIST_TAG 的位置 */ option = (char *)pickup_opt(dhcpsMsgIn.dhcp, priv_rdhcplen, _DHCP_REQ_LIST_TAG); if (option != NULL) { reqopt = OPTBODY (option);/* option的类型 */ reqoptlen = DHCPOPTLEN (option); /* * Handle requested parameters. The PASSIVE flag only inserts options * explicity configured into the resource entry. (Rule 1 of RFC 1541). * Because the implementation used "tblc=dflt" to force inclusion of * any missing parameters defined in the Host Requirements Document, * the PASSIVE flag will also include those settings if not already * present. (Rule 2 of RFC 1541). */ for (i = 0; i < reqoptlen; i++) /* 一共需要reqoptlen个options */ { /* inserted 是一个位图,如果提供了某个options,它就会在该options对应的位上写上'1', 表示系统存在该位 */ char tmpOpt = (*(reqopt + i)); switch(tmpOpt) { case _DHCP_CLASS_ID_TAG: { { DEBUG_DHCPS("class id\r\n"); char classIdStr[DHCPS_MAX_CLASS_ID_STR_LEN+1] = {0}; int idlen = 0; if (ERR_NO_ERROR == rtdDhcpsGetClassId(classIdStr)) { DEBUG_DHCPS("class id %s\r\n", classIdStr); idlen= strlen(classIdStr); if( 0 < idlen&&!ISSET(inserted, _DHCP_CLASS_ID_TAG)) { #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_CLASS_ID_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = idlen; memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], classIdStr, idlen); priv_off_options += idlen; #endif addOption[0] = _DHCP_CLASS_ID_TAG; addOption[1] = idlen; memcpy(&addOption[2], classIdStr, idlen); ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted,_DHCP_CLASS_ID_TAG); } } } insert_custom(res, lease, tmpOpt, inserted, flag,poolParam); } break; } case _DHCP_WAPCAP_AC_TAG: { #if 0 /* 存在用户指定的option 138字段添加上去 */ { DEBUG_DHCPS("wapcap ip\r\n"); struct in_addr acAddr; if (ERR_NO_ERROR == swDhcpsGetCapwapAcIp(&acAddr)) { acAddr.s_addr = htonl(acAddr.s_addr); DEBUG_DHCPS("wapcap ip %x\r\n", acAddr.s_addr); if( 0 != acAddr.s_addr ) { dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_WAPCAP_AC_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = 4; memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], (char*)&acAddr.s_addr, 4); priv_off_options += 4; } } } break; #endif /* 存在用户指定的option 138字段添加上去 */ { DEBUG_DHCPS("wapcap ip\r\n"); if (ERR_NO_ERROR == rtdDhcpsGetCapwapAcIp(&acAddr)) { if( 0 != acAddr.s_addr ) { hasAcAdrr = 1; } } if (hasAcAdrr == 0&&poolParam.controllerIp.s_addr!=0) { acAddr.s_addr=poolParam.controllerIp.s_addr; if( 0 != acAddr.s_addr ) { hasAcAdrr = 1; } } if (hasAcAdrr&&!ISSET(inserted, _DHCP_WAPCAP_AC_TAG)) { acAddr.s_addr = htonl(acAddr.s_addr); DEBUG_DHCPS("wapcap ip %x\r\n", acAddr.s_addr); #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_WAPCAP_AC_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = 4; memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], (char*)&acAddr.s_addr, 4); priv_off_options += 4; #endif addOption[0] = _DHCP_WAPCAP_AC_TAG; addOption[1] = 4; memcpy(&addOption[2], (char*)&acAddr.s_addr, 4); ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, _DHCP_WAPCAP_AC_TAG); } } insert_custom(res, lease, tmpOpt, inserted, flag,poolParam); } break; } case _DHCP_DNS_DOMAIN_TAG: { /* insert domain name */ { char domainName[DHCPS_DOMAIN_NAME_LEN + 1]; UINT8 len = 0; if(poolParam.domainName!=NULL) { len=strlen(poolParam.domainName); if(len>0) { snprintf(domainName,DHCPS_DOMAIN_NAME_LEN + 1,"%s",poolParam.domainName); domainName[len]='\0'; } } DEBUG_DHCPS("domain name"); if ( 0 < len && !ISSET(inserted, _DHCP_DNS_DOMAIN_TAG)) { #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_DNS_DOMAIN_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = len; memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], domainName, len); priv_off_options += len; #endif addOption[0] = _DHCP_DNS_DOMAIN_TAG; addOption[1] = len; memcpy(&addOption[2], domainName, len); ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, _DHCP_DNS_DOMAIN_TAG); } } insert_custom(res, lease, tmpOpt, inserted, flag,poolParam); } break; } case _DHCP_NBN_SERVER_TAG: { /* insert NetBIOS name server */ { struct in_addr nbnServer[DHCPS_MAX_NBNSERVER_NUM]; UINT8 num = 0; UINT8 cnt = 0; DEBUG_DHCPS("netbios server"); DEBUG_DHCPS("res->ip_addr:%x", (UINT32)res->ip_addr.ip.s_addr); for (cnt = 0; cnt< DHCPS_MAX_NBNSERVER_NUM; cnt++) { if (0 != poolParam.netBiosNameServer[cnt].s_addr) { nbnServer[(num)++].s_addr = poolParam.netBiosNameServer[cnt].s_addr; } } if ( 0 < num&& !ISSET(inserted, _DHCP_NBN_SERVER_TAG) ) { #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_NBN_SERVER_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = 4 * num; for (cnt = 0; cnt < num; cnt++) { DHCP_PKT_HTONL(nbnServer[cnt].s_addr); memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], (char *)&nbnServer[cnt].s_addr, 4); DHCP_PKT_NTOHL(nbnServer[cnt].s_addr); DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options]); DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options+1]); DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options+2]); DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options+3]); priv_off_options += 4; } #endif addOption[0] = _DHCP_NBN_SERVER_TAG; addOption[1] = 4 * num; for (cnt = 0; cnt < num; cnt++) { DHCP_PKT_HTONL(nbnServer[cnt].s_addr); memcpy(&addOption[2+4*cnt], (char *)&nbnServer[cnt].s_addr, 4); } ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, _DHCP_NBN_SERVER_TAG); } } insert_custom(res, lease, tmpOpt, inserted, flag,poolParam); } break; } case _DHCP_NB_NODETYPE_TAG: { /* insert NetBIOS node type */ { NETBIOS_NODE_TYPE netBiosNodeType; DEBUG_DHCPS("NetBIOS node type"); netBiosNodeType=poolParam.netBiosNodeType; if ( NBN_SERVER_NODE_TYPE_ERR != netBiosNodeType&& !ISSET(inserted, _DHCP_NB_NODETYPE_TAG)) { #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_NB_NODETYPE_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = 1; dhcpsMsgOut.dhcp->options[priv_off_options++] = netBiosNodeType; #endif addOption[0] = _DHCP_NB_NODETYPE_TAG; addOption[1] = 1; addOption[2] = netBiosNodeType; ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, _DHCP_NB_NODETYPE_TAG); } } insert_custom(res, lease, tmpOpt, inserted, flag,poolParam); } break; } default: { if (tmpOpt != 0) { for (j=0; j<DHCPS_MAX_OPTION_NUM; j++) { if (tmpOpt == poolParam.option[j].code && !ISSET(inserted, tmpOpt)) { if(_DHCP_SIP_TAG == tmpOpt) { addOption[0] = tmpOpt; addOption[1] = poolParam.option[j].len + 1; if(poolParam.option[j].type==OP_IP) { addOption[2] = 1; struct in_addr tmpAddr; tmpAddr.s_addr=poolParam.option[j].value.ip.s_addr; DHCP_PKT_HTONL(tmpAddr.s_addr); memcpy(&addOption[3], (char *)&tmpAddr.s_addr, 4); } else { addOption[2] = 0; if (OP_HEX == poolParam.option[j].type) { memcpy(&addOption[3], &(poolParam.option[j].value.hex), poolParam.option[j].len); } else { memcpy(&addOption[3], &(poolParam.option[j].value.ascii), poolParam.option[j].len); } } ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, tmpOpt); } } else if (OP_HEX == poolParam.option[j].type) { memcpy(&addOption[2], &(poolParam.option[j].value.hex), poolParam.option[j].len); } else { addOption[0] = tmpOpt; addOption[1] = poolParam.option[j].len; if(poolParam.option[j].type==OP_IP) { struct in_addr tmpAddr; tmpAddr.s_addr=poolParam.option[j].value.ip.s_addr; DHCP_PKT_HTONL(tmpAddr.s_addr); memcpy(&addOption[2], (char *)&tmpAddr.s_addr, 4); } else { memcpy(&addOption[2], &(poolParam.option[j].value), poolParam.option[j].len); } ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, tmpOpt); } } } } } break; } } } } /* 在报文的option字段中,找到_DHCP_OPTION82_TAG的位置 */ option = (char *)pickup_opt(dhcpsMsgIn.dhcp, priv_rdhcplen, _DHCP_OPTION82_TAG); if (option != NULL) { #if 0 dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_OPTION82_TAG; dhcpsMsgOut.dhcp->options[priv_off_options++] = DHCPOPTLEN(option); memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], option + 2, DHCPOPTLEN(option)); /* parasoft-suppress PB-34 "hurihui" */ priv_off_options += DHCPOPTLEN(option); #endif addOption[0] = _DHCP_OPTION82_TAG; addOption[1] = DHCPOPTLEN(option); memcpy(&addOption[2], option + 2, DHCPOPTLEN(option)); ret = insert_it((char *)addOption); if (ret == 0) { SETBIT(inserted, _DHCP_OPTION82_TAG); } } return (0); } 以上代码对于dhcp option120即_DHCP_SIP_TAG的hex和string格式的填充是否有误
07-11
public JSONObject queryTsTargetStatus(JSONObject jsonObject) { int index = jsonObject.getInteger("index") ; int pageSize = jsonObject.getInteger("pageSize"); // 卫星 String satelliteId = jsonObject.getString("satelliteId"); // 国家 String ownNation = jsonObject.getString("ownNation"); // 目标名称 String targetName = jsonObject.getString("targetName"); // 类型 String dataType = jsonObject.getString("dataType"); // 判读状态 String status = jsonObject.getString("status"); // 时间 范围计算 String startTime = jsonObject.getString("startTime"); String endTime = jsonObject.getString("endTime"); if(dataType.equals("电子")){ dataType = "dz"; }else if((dataType.equals("成像"))){ dataType = "cx"; } String finalDataType = dataType; // 创建分页请求(按scout_time倒序排序) Pageable pageable = PageRequest.of(index, pageSize, Sort.by(Sort.Direction.DESC, "scoutTime")); Specification<Tsqb> spec = (root, query, cb) -> { List<Predicate> predicates = new ArrayList<>(); if (StringUtils.isNotBlank(satelliteId)) { predicates.add(cb.equal(root.get("satelliteId"), satelliteId)); } if (StringUtils.isNotBlank(ownNation)) { predicates.add(cb.equal(root.get("ownNation"), ownNation)); } if (StringUtils.isNotBlank(targetName)) { predicates.add(cb.like(root.get("targetName"), "%" + targetName + "%")); } if (StringUtils.isNotBlank(finalDataType)) { predicates.add(cb.equal(root.get("dataType"), finalDataType)); } if (StringUtils.isNotBlank(status)) { predicates.add(cb.equal(root.get("status"), status)); } if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { predicates.add(cb.between(root.get("scoutTime"), LocalDateTime.parse(startTime, DateTimeFormatter.ISO_DATE_TIME), LocalDateTime.parse(endTime, DateTimeFormatter.ISO_DATE_TIME))); } return cb.and(predicates.toArray(new Predicate[0])); }; // 执行分页查询 Page<Tsqb> resultPage = tsqbDao.findAll(spec, pageable); List<Tsqb> tsqbList = resultPage.getContent(); tsqbList.stream().forEach(ts -> { String friendOrFoe = ts.getFriendOrFoe(); if (friendOrFoe == null || StringUtils.isEmpty(friendOrFoe)) { ts.setFriendOrFoe("未知"); } }); JSONObject res = new JSONObject(); res.put("total",resultPage.getTotalElements()); res.put("data",tsqbList); return res; }其中一些字段值为空,返给前端时会自动隐藏吗
最新发布
07-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值