我有一个pojo类,例如:
A类Pojo:
public class A{
private String field1;
private String field2;
@JsonSerialize(using = NumberFormatterToString.class, as = String.class)
private Integer field3;
//getters and setters
}
现在,在从spring REST API返回field3时,我希望将其转换为
输入:字段3-312548
输出字段3-“312548”
为此,我编写了自定义类JsonSerializer:
自定义JsonSerializer:
public class NumberFormatterToString extends JsonSerializer<Integer> {
@Override
public void serialize(Integer value, JsonGenerator jsonGenerator, SerializerProvider serializers) throws IOException {
jsonGenerator.writeObject(convertIntegerNumberFormat(value));
}
public static String convertIntegerNumberFormat(Integer i) {
NumberFormat myFormat = NumberFormat.getInstance();
myFormat.setGroupingUsed(true);
return i != null ? myFormat.format(i) : null;
}
public static String convertDecimalNumberFormat(Double i) {
DecimalFormat decimalFormat = new DecimalFormat("#.0000");
decimalFormat.setGroupingUsed(true);
decimalFormat.setGroupingSize(3);
return i != null ? decimalFormat.format(i) : null;
}
}
如果我使用这个注释,它会在内部操作时转换它,从而导致已经编写的基于整数的逻辑失败。因此,我想以这样一种方式配置它,对于所有内部操作,它应该考虑整数,只有在通过API返回响应时,它应该将其转换为字符串值。
我不确定我应该如何配置它?
我终于在代码逻辑需要更改的任何地方调用了这个函数。
public static String convertIntegerNumberFormat(Integer i) {
NumberFormat myFormat = NumberFormat.getInstance();
myFormat.setGroupingUsed(true);
return i != null ? myFormat.format(i) : null;
}
假设DTO的定义如下:
@JsonSerialize(using = InfoSerializer.class)
@JsonDeserialize(using = InfoDeserializer.class)
class Info {
private String name;
private String address;
private Integer age;
}
信息的序列化程序和反序列化程序定义
class InfoSerializer extends JsonSerializer<Info> {
@Override
public void serialize(Info value, JsonGenerator jsonGenerator, SerializerProvider serializers) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("name", value.getName());
jsonGenerator.writeStringField("address", value.getAddress());
jsonGenerator.writeStringField("age", value.getAge().toString());
jsonGenerator.writeEndObject();
}
}
class InfoDeserializer extends JsonDeserializer<Info> {
@Override
public Info deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
JsonNode node = jsonParser.getCodec().readTree(jsonParser);
int age = Integer.parseInt(node.get("age").asText());
String name = node.get("name").asText();
String address = node.get("address").asText();
Info info = new Info();
info.setName(name);
info.setAddress(address);
info.setAge(age);
return info;
}
}
测试控制器
@PostMapping(value = "/test/mapper")
public Mono<Info> test(@RequestBody Info info) {
System.out.println(info);
return Mono.just(info);
}
输入
{
"name":"huawei",
"address":"shen zhen",
"age":"31"
}
测试控制器打印消息
Info{name='huawei', address='shen zhen', age=31}
客户端获取的响应
{
"name": "huawei",
"address": "shen zhen",
"age": "31"
}
可能您所要做的就是创建自定义反序列化器。尝试以类似的方式修改您的pojo:
public class A {
private String field1;
private String field2;
@JsonDeserializer(using = NumberFormatterToInteger.class)
@JsonSerialize(using = NumberFormatterToString.class, as = String.class)
private Integer field3;
}
并创建扩展JsonDeserializer的自定义类
public class NumberFormatterToInteger extends JsonDeserializer<Integer> {
@Override
public Integer deserialize(JsonParser parser, DeserializationContext context) {
return YourParser.toInt(parser.getText()); // some logic that could look like that
}
}
希望它能起作用。
是否有一种简单的方法来反序列化可以是或
我想有一个使用Spring Boot的微服务项目,它通过通过Spring Data JPA项目创建的依赖项访问实体和DAO。这个想法是多个微服务可以获得该依赖项。 然而,当jar在Spring Boot Data JPA项目中组装时,它通过starter依赖项包含了许多依赖项。其中大多数也出现在使用它的Spring Boot Microservice项目中。 您将如何通过Spring Data J
问题内容: 我正在尝试反序列化(使用gson)如下所示的JSON对象: 我该如何处理?我什至不知道该怎么称呼- 这里代表了多个“项目”,但这不是一个数组。当我尝试将其反序列化为数组时,程序在“预期的Begin_Array但找到Begin_Object”异常时崩溃。当我尝试将其反序列化为Strong对象时(请参见下面的类),程序将运行,但所有字段均返回null。 这是我尝试将其映射到的类: 完整的J
问题内容: 我有以下课程: 我有Struts2控制器,我只想返回Class Student的序列化实例。 它返回了带有所有子类的可序列化的学生对象,但是我只希望有一个学生对象而没有返回hashset。如何告诉Struts仅序列化对象?我确实启用了延迟加载,并且将哈希集作为代理类返回。 问题答案: 请参见此处的答案,其中显示了包含和排除属性的使用。我不认为该示例明确显示排除嵌套对象,但是我已将其用于
在Spring批处理中,ItemReader或ItemProcessor返回其item对象后,框架将该项放入ArrayList中,以传递给ItemWriter。 我需要在ItemProcessor中访问项目的ArrayList。我需要的核心功能是在ItemReader/ItemProcessor处理Arraylist的块时访问它。 我的想法是使用ApplicationContextAware It
我创建了这个测试项目,由两个项目组成:一个使用spring-boot,一个使用Spring-MVC。它们中的每一个单独工作都很好。我想要做的是运行spring-boot,并能够通过加载spring-mvc项目的上下文来访问该项目的web页面。这个项目很简单,因为我只是想测试如何做混合。 问题是,当我运行spring-boot应用程序时,来自spring-mvc的页面无法访问,因为它没有在构建中添加