相对于以前的逐层解析,FastJson相对简单多了。
这里先给一个简单的json串示例
{
'head': {
'requestId': 'rk-endr-990001541762381241-39157',
'requestType': 'G001',
'sign': 'Sign TODO...'
},
'body': {
'policy': {
'policyRef': '201-1-543-18-010967-000-00-001'
},
'agency': {
'agencyCode': 'AC000006'
},
'planList': [{
'planCode': 'P5-ALLTESTRRT',
'insuredList': [{
'insuredId': 'P0A600000001',
'insuredName': '曹操1'
},
{
'insuredId': 'P0A600000002',
'insuredName': '曹操2'
}
]
},
{
'planCode': 'PA222-zzzzz',
'insuredList': [{
'insuredId': 'P2B00000001',
'insuredName': '张三1'
}]
}
]
}
}
具体方式mapper.readValue基于JsonParser和JSONObject.parseObject基于DefaultJSONParser两种方式均可以获取到目标对象
请求为json代码处理成对象的过程,这里直接贴代码
// EndorsementBody的结构为
// protected EndorsementPolicy policy;
// protected List<EndorsementPlan> planList;
// protected AgencyVO agency;
JSONObject jsonObject = JSONObject.parseObject(str);
ObjectMapper mapper = new ObjectMapper();
try {
EndorsementBody body2 = mapper.readValue(jsonObject.get("body").toString(), EndorsementBody.class);
//JSONObject.parseObject(jsonObject.get("body").toString(),EndorsementBody.class);
System.out.println(body2.getPolicy().getPolicyRef());
System.out.println(body2.getAgency().getAgencyCode());
//EndorsementBody body2 = (EndorsementBody) jsonRequest2.getBody();
body2 = JSONObject.parseObject(jsonObject.get("body").toString(),EndorsementBody.class);
System.out.println(body2.getPolicy().getPolicyRef());
System.out.println(body2.getAgency().getAgencyCode());
} catch (IOException e) {
e.printStackTrace();
}
以前做前端有过validator.js,现在写后端接口也需要对字段进行一些简单的校验。这里分享下整个校验的实现流程:(基于validator的Bean注解校验)
pom文件:对应依赖如下
<!-- https://mvnrepository.com/artifact/javax.validation/com.springsource.javax.validation -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>com.springsource.javax.validation</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
基于之前的博客的json转对象的方法分享,
我是(接收json报文之后)在json对象转换完毕之后调的校验方法,默认返回的第一条异常信息,这里提供以下两个方法:
/**
* json转换成类
* @param json
* @return
* @throws IOException
* @throws JsonParseException
* @throws JsonMappingException
*/
public static <T> T toObject(String json, Class<T> clazz) throws IOException, JsonParseException,
JsonMappingException {
ObjectMapper mapper = new ObjectMapper();
T object = mapper.readValue(json, clazz);
Beans.beanValidate(object);
return object;
}
/**
* 验证某个bean的参数
* @param object
*/
public static <T> void beanValidate(T object) {
//获得验证器
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
//执行验证
Set<ConstraintViolation<T>> constraintValidations = validator.validate(object);
//如果有验证信息,则将第一个取出来包装成异常返回--这里可以执行打印内容校验结果
if (CollectiongUtils.isNotEmpty(constraintValidations)) {
String validateStrCode = constraintValidations .iterator().next().getMessage();
String pathError = constraintValidations .iterator().next().getPropertyPath().toString();
throw new ValidationException(validateStrCode + "," + pathError);
}
}
接下来提供一些bean的例子,先贴一下一些注解的说明:
@Null 限制只能为null @NotNull 限制必须不为null @AssertFalse 限制必须为false @AssertTrue 限制必须为true @DecimalMax(value) 限制必须为一个不大于指定值的数字 @DecimalMin(value) 限制必须为一个不小于指定值的数字 @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction @Future 限制必须是一个将来的日期 @Max(value) 限制必须为一个不大于指定值的数字 @Min(value) 限制必须为一个不小于指定值的数字 @Past 限制必须是一个过去的日期 @Pattern(value) 限制必须符合指定的正则表达式 @Size(max,min) 限制字符长度必须在min到max之间 @Past 验证注解的元素值(日期类型)比当前时间早 @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
本来以为只有简单的校验,但是发现了@Pattern,既然可以用正则表达式,那还不是为所欲为!
注意:嵌套使用时@Valid的作用是激活校验否则不会校验到属性类的相关注解
//嵌套使用时@Valid的作用是激活校验否则不会校验到属性类的相关注解
public class EndorsementBody {
@Valid
protected EndorsementPolicy policy;
@Valid
protected List<EndorsementPlan> planList;
@Valid
protected AgencyVO agency;
}
public class EndorsementPlan {
@NotNull(message="0001")
private String planCode;
@Valid
@NotNull(message="0001")
protected List<EndorsementInsured> insuredList;
}
public class EndorsementInsured {
// @Pattern(regexp="^(1|2|3)$",message="1099")
// @NotNull(message="0001")
private String insuredType;
// @Pattern(regexp="^[0-9]*$",message="0005")
@NotNull(message="0001")
private String insuredId;
@NotNull(message="0001")
private String insuredName;
@Pattern(regexp="^(1|2|3)$",message="1099")
@NotNull(message="0001")
private String idType;
@NotNull(message="0001")
private String idNumber;
@DateTimeFormat(pattern = "yyyyMMddHHmmss")
@NotNull(message="0001")
private Date birthDate;
@NotNull // 不能为空
@DecimalMin(value = "0.1") // 最小值0.1元
@DecimalMax(value = "10000.00") // 最大值10000元
private Double doubleValue;
@Min(value = 1, message = "最小值为1") // 最小值为1
@Max(value = 88, message = "最大值为88") // 最大值88
@NotNull // 不能为空
private Integer integer;
@Range(min = 1, max = 888, message = "范围为1至888") // 限定范围
private Long range;
// 邮箱验证
@Email(message = "邮箱格式错误")
private String email;
@Size(min = 20, max = 30, message = "字符串长度要求20到30之间。")
private String size;
}
对应注解支持自定义的方式点击-------自定义注解连接
博主的message返回大部分是自定义代码,再抛出异常信息之后捕获。然后通过文件配置的方式读取错误码的信息,返回对应的提示,这里就不做多介绍了。基础校验按照上述流程基本可以实现!