从零搭建开发脚手架 Jackson使用心得和常用注解(1)

用于指定如何格式化 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”);

或者,也可以使用getwithAPI 代替_path_。

如果路径未知,搜索当然会变得更加复杂和迭代。

添加新节点

一个节点可以添加为另一个节点的子节点,如下所示:

ObjectNode newNode = ((ObjectNode) locatedNode).put(fieldName, value);

_put 的_许多重载变体可用于添加不同值类型的新节点。

许多其他类似的方法也可用,包括_putArray_、putObjectPutPOJOputRawValue_和_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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值