当前位置: 首页 > 知识库问答 >
问题:

Spring项目的Java Json序列化

屈浩波
2023-03-14

我有一个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返回响应时,它应该将其转换为字符串值。

我不确定我应该如何配置它?

共有3个答案

燕经国
2023-03-14

我终于在代码逻辑需要更改的任何地方调用了这个函数。

 public static String convertIntegerNumberFormat(Integer i) {
        NumberFormat myFormat = NumberFormat.getInstance();
        myFormat.setGroupingUsed(true);

        return i != null ? myFormat.format(i) : null;

    }
方和宜
2023-03-14

假设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"
}
於和志
2023-03-14

可能您所要做的就是创建自定义反序列化器。尝试以类似的方式修改您的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的页面无法访问,因为它没有在构建中添加