json && 前后端交互
1、java对象转成json成立的基本条件只需要有get方法
public class ResultView<DATA> {
public long getTimestamp() {
return System.currentTimeMillis();
}
public String getHostname() {
return HostInfo.getHostName();
}
}
则ObjectMapperUtils.toJSON(resultView)的结果是{hostname":"MacBook-Pro.local","timestamp":1650543262512},所以get方法可以把java对象可自动转为json
ajax参数 contentType表示告诉服务器请求数据的类型
dataType表示告诉服务器,我要想什么类型的数据
3、@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8"):
private Date createTime;
表示序列化时,将createTime字段转为yyyy-MM-dd HH:mm:ss格式
4、@JsonValue: 序列化时,将枚举序列化为code或name,反序列化时,由code或name反序列化成枚举
public enum GridElement {
/**
* 商业化元素
*/
BUSINESS_ELEMENT(6, "商业化元素"),
;
private int intValue;
private String desc;
@JsonValue
public String getDesc() {
return desc;
}
}
表示BUSINESS_ELEMENT序列化的结果是「商业化元素」,也可以由「商业化格元素」反序列化得到BUSINESS_ELEMENT
5、@JsonUnwrapped注解:将嵌套的对象平铺展开
https://juejin.cn/post/7067812048419160071
6、hive解析json:https://blog.csdn.net/qq_34105362/article/details/80454697
get_json_object(response_detail, '$.body.messages[0].status') = 6
mysql解析json:https://blog.csdn.net/unity_zyc/article/details/80654442
7、java类转为json字符串,下列条件需要满足一个:
a、对应字段需要有set和get方法,否则该字段转化的结果为空。
b、如果没有get和set方法,可以用@JsonProperty注解,也可以达到将类转为json字符串效果
8、jackson在反序列化时,默认使用对象的默认构造函数,如果默认构造函数不存在,jackson会报错。
9、@JsonProperty注解作用:此注解用于属性上,作用是把该属性的名称序列化为另外一个名称。
10、在某字段上注释@JsonIgnore,可以在json序列化时忽略此字段
11、@JsonCreator注解其作用是,指定对象反序列化时的构造函数或者工厂方法,如果默认构造函数无法满足需求,或者说我们需要在构造对象时做一些特殊逻辑,可以使用该注解。该注解需要搭配@JsonProperty使用。
@JsonCreator
public Person(@JsonProperty("age") int age, @JsonProperty("name") String name) {
this.age = age;
this.name = name;
}
如果不使用JsonCreator,那么需要提供无参构造函数以及对应的setter方法
12、json序列化:SerializationFeature.FAIL_ON_EMPTY_BEANS的值默认为true,该属性的意思是,如果一个对象中没有任何的属性,那么在序列化的时候就会报错。如果设置mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS),那么序列化就不会报错了。在类上面加注解@JsonIgnoreProperties(ignoreUnknown = true) 也可以解决此错误
13、@JsonIgnoreProperties(value = {"name","age"}) 可以注解在类上面,意味着忽略了name和age属性,在序列化的时候,会忽略这两个属性,只序列化其他属性
14、@JsonIgnoreProperties(ignoreUnknown = true) 主要用在反序列化上。正常情况下,如果我们json串中有一些key值和我们的POJO对象不匹配,那么将会抛出异常。
比如json串中有个key名称为height222,pojo中字段为height111,反序列化就会抛异常。如果加上此注解则不会抛异常了。使用 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 也可以达到同样的目的
15、@JsonSerialize:json序列化注解,用于字段或get方法上,作用于getter()方法,将java对象序列化为json数据
@JsonDeserialize:json反序列化注解,用于字段或set方法上,作用于setter()方法,将json数据反序列化为java对象
16、@JsonInclude:
JsonJsonInclude.Include.ALWAYS 这个是默认策略,任何情况下都序列化该字段,和不写这个注解是一样的效果。
JsonJsonInclude.Include.NON_NULL这个最常用,即如果加该注解的字段为null,那么就不序列化这个字段了。
JsonJsonInclude.Include.NON_EMPTY 这个属性包含NON_NULL,NON_ABSENT之后还包含如果字段为空也不序列化。这个也比较常用
JsonJsonInclude.Include.NON_DEFAULT 这个也好理解,如果字段是默认值的话就不序列化
public class Employee2 {
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
private String name;
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
private String dept;
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
private Integer salary;
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
private boolean fullTime;
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
private List<String> phones;
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
private Date dateOfBirth;
}
public class ExampleMain2 {
public static void main(String[] args) throws IOException {
Employee2 employee = new Employee2();
employee.setName("Trish");
employee.setFullTime(false);
employee.setPhones(new ArrayList<>());
employee.setSalary(Integer.valueOf(0));
employee.setDateOfBirth(new Date(0));
ObjectMapper om = new ObjectMapper();
String jsonString = om.writeValueAsString(employee);
System.out.println(jsonString);
}
}
输出结果是{"name":"Trish"},因为Employee2的其他字段都是默认值
17、@RequestParam只应用于content-type为application/x-www-form-urlencoded(传统表单方式)的场景或者是请求url ?后的参数
curl -X GET \
http://bjfk-staging-ls508.yz02:9494/rest/infra/id/card/user/bind/account?uid=xxx&name=xxx&identity=xxx&appType=xxx
后端使用@RequestParam分别承接几个参数即可
ajax默认的格式为application/x-www-form-urlencoded,相当于(username="admin"&password=123)来传递数据,当ajax为默认格,后端可以用两种方式:1、@RequestParam分别接收参数。2、可以封装为对象接收或者单个参数接收