|
2019-05-17
public class User { private final String name; private final Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE) @JsonIgnoreProperties(ignoreUnknown = true) @JsonDeserialize(using = UserMixin.UserDeserializer.class) public abstract class UserMixin { /** * 反序列化类 **/ static class UserDeserializer extends JsonDeserializer<User> { @Override public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { ObjectMapper mapper = (ObjectMapper) p.getCodec(); JsonNode jsonNode = mapper.readTree(p); String name = readJsonNode(jsonNode, "name").asText(null); String age = readJsonNode(jsonNode, "age").asText(null); Integer ageVal = Objects.isNull(age)? null: Integer.valueOf(age); return new User(name,ageVal); } private JsonNode readJsonNode(JsonNode jsonNode, String field) { return jsonNode.has(field) ? jsonNode.get(field) : MissingNode.getInstance(); } } }
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.addMixIn(User.class, UserMixin.class); User felord = new User("felord", 12); String json = objectMapper.writeValueAsString(felord); //{"name":"felord","age":12} System.out.println("json = " + json); String jsonStr = "{\"name\":\"felord\",\"age\":12}"; User user = objectMapper.readValue(jsonStr, User.class); // User{name='felord', age=12} System.out.println("user = " + user);
public class UserModule extends SimpleModule { public UserModule() { super(UserModule.class.getName()); } @Override public void setupModule(SetupContext context) { context.setMixInAnnotations(User.class,UserMixin.class); } }Module同样可以注册到ObjectMapper中,同样也能实现我们想要的效果:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new UserModule()); // 省略
ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); mapper.registerModule(new CoreJackson2Module()); mapper.registerModule(new CasJackson2Module()); mapper.registerModule(new WebJackson2Module()); mapper.registerModule(new WebServletJackson2Module()); mapper.registerModule(new WebServerJackson2Module()); mapper.registerModule(new OAuth2ClientJackson2Module());建议看一下SecurityJackson2Modules源码,研究并模仿一下Module的使用。
编辑:航网科技 来源:腾讯云 本文版权归原作者所有 转载请注明出处
微信扫一扫咨询客服
全国免费服务热线
0755-36300002