用于指定如何格式化 JSON 的字段和属性。例如时间类型字段的格式化,jackson提供,当前端传来json串,后台用@ReuqestBody接收,用@JsonFormat 规定接收的时间格式。可用于json格式的序列化和反序列化。
//设置时区为上海时区,时间格式自己据需求定。
@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”,timezone = “GMT+8”)
private Date time;
@DataTimeFormat
用于指定如何格式化 JSON 输入的字段和属性。例如时间类型字段的格式化,注意这里只能用于反序列化时,前台输入数据到后台时。spring提供,当前端传来的是键值对,用@DateTimeFormat 规定接收的时间格式。
Response get(@PathVariable Long id,@DateTimeFormat(pattern = “yyyy-MM-dd”) Date time)
后端返回给前端的时间值,只能用@JsonFormat 规定返回格式,@DateTimeFormat 无法决定返回值的格式。
@JsonPropertyOrder
用于指定序列化属性的顺序。
@JsonPropertyOrder({ “name”, “id” })
public class MyBean {
public int id;
public String name;
}
{
“name”:“My bean”,
“id”:1
}
@JsonRawValue
用于指定json格式的string类型
public class RawBean {
public String name;
@JsonRawValue
public String json;
}
序列化实体的输出是:
{
“name”:“My bean”,
“json”:{
“attr”:false
}
}
@JsonAlias
指定反序列化过程属性的一个或多个的别名。
让我们通过一个简单的例子来看看这个注解是如何工作的:
public class AliasBean {
@JsonAlias({ “fName”, “f_name” })
private String firstName;
private String lastName;
}
{
“fName”: “laker”,
“lastName”: “laker2”
}
@JsonIgnoreProperties
类级别的注解,用于标记 Jackson 将忽略的属性或属性列表。
@JsonIgnoreProperties({ “id” })
public class BeanWithIgnore {
public int id;
public String name;
}
序列化的结果是不包含id属性的
@JsonIgnore
用于在字段级别标记要忽略的属性。
public class BeanWithIgnore {
@JsonIgnore
public int id;
public String name;
}
序列化的结果是不包含id属性的
@JsonProperty
public class MyBean {
public int id;
private String name;
@JsonProperty(“name”)
public void setTheName(String name) {
this.name = name;
}
@JsonProperty(“name”)
public String getTheName() {
return name;
}
}
格式化PrettyJson
ObjectMapper mapper = new ObjectMapper();
String jsonResult = mapper.writerWithDefaultPrettyPrinter()
.writeValueAsString(map);
枚举类型描述
/**
- 事故类型
*/
private AccidentTypeEnum accidentType;
/**
- 事故类型描述
*/
@JsonGetter
private String getAccidentTypeDes() {
if (accidentType == null) {
return “”;
}
return accidentType.getDescp();
}
指定某个字段序列化和反序列化
/**
- 因为密码比较重要,故仅用于反序列化
*/
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
时间序列化和反序列化
//设置时区为上海时区,时间格式自己据需求定。
@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”,timezone = “GMT+8”)
private Date time;
反序列化List
public static List jsonArrayToList(String json, Class elementClass) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, elementClass);
return objectMapper.readValue(json, listType);
}
反序列化Map
String json = “{ “color” : “Black”, “type” : “BMW” }”;
Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){});
使用JsonNode进行各种转换以及添加、修改和删除节点
创建节点
从无到有创建节点的最常见方法如下:
JsonNode node = mapper.createObjectNode();
或者,我们也可以通过JsonNodeFactory创建一个节点:
JsonNode node = JsonNodeFactory.instance.objectNode();
从字符串创建节点
String jsonString = “{“k1”:“v1”,“k2”:“v2”}”;
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree(jsonString);
从对象创建节点
可以通过调用_ObjectMapper_上的*valueToTree(Object fromValue)*方法从 Java 对象转换节点:
JsonNode node = mapper.valueToTree(fromValue);
或者
JsonNode node = mapper.convertValue(fromValue, JsonNode.class);
转换节点
NodeBean toValue = mapper.treeToValue(node, NodeBean.class);
这在功能上等同于:
NodeBean toValue = mapper.convertValue(node, NodeBean.class)
定位节点
在处理任何节点之前,我们需要做的第一件事是定位它并将其分配给一个变量。
如果事先知道节点的路径,这很容易做到。例如,假设我们想要一个名为last
的节点,它位于node
下:
JsonNode locatedNode = rootNode.path(“name”).path(“last”);
或者,也可以使用get或withAPI 代替_path_。
如果路径未知,搜索当然会变得更加复杂和迭代。
添加新节点
一个节点可以添加为另一个节点的子节点,如下所示:
ObjectNode newNode = ((ObjectNode) locatedNode).put(fieldName, value);
_put 的_许多重载变体可用于添加不同值类型的新节点。
许多其他类似的方法也可用,包括_putArray_、putObject、PutPOJO、putRawValue_和_putNull。
编辑节点
一个_ObjectNode_实例可以通过调用被修改字符串fieldName,JsonNode值方法:
JsonNode locatedNode = locatedNode.set(fieldName, value);
通过在相同类型的对象上使用replace或setAll方法可以实现类似的结果。
删除节点
可以通过在其父节点上调用_remove(String fieldName)_ API来删除节点:
JsonNode removedNode = locatedNode.remove(fieldName);
为了一次删除多个节点,我们可以调用一个带有Collection类型参数的重载方法,它返回父节点而不是要删除的节点:
ObjectNode locatedNode = locatedNode.remove(fieldNames);
在极端情况下,当我们想删除一个给定节点的所有子节点*-_的_的removeAll* API就派上用场了。
迭代节点
JSON 有三种类型的节点,分别是值、对象和数组。
因此,让我们通过添加一个_数组来_确保我们的示例数据具有所有三种不同的类型
处理不同的节点类型
我们需要稍微不同地处理不同类型的节点。我们将在_processNode_方法中执行此操作:
最后
可以通过在其父节点上调用_remove(String fieldName)_ API来删除节点:
JsonNode removedNode = locatedNode.remove(fieldName);
为了一次删除多个节点,我们可以调用一个带有Collection类型参数的重载方法,它返回父节点而不是要删除的节点:
ObjectNode locatedNode = locatedNode.remove(fieldNames);
在极端情况下,当我们想删除一个给定节点的所有子节点*-_的_的removeAll* API就派上用场了。
迭代节点
JSON 有三种类型的节点,分别是值、对象和数组。
因此,让我们通过添加一个_数组来_确保我们的示例数据具有所有三种不同的类型
处理不同的节点类型
我们需要稍微不同地处理不同类型的节点。我们将在_processNode_方法中执行此操作:
最后
[外链图片转存中…(img-UgNCHXv5-1720026525815)]
[外链图片转存中…(img-I2ypTy3B-1720026525816)]
[外链图片转存中…(img-5rqeZ3SK-1720026525817)]