基于配置文件,可切换的JSON缩小Java,Spring



对于杰克逊,字段上的注释@JsonProperty("a")会将其名称序列化为a。对于 Gson,这将按照@SerializedName("a")完成。

注释类的所有序列化字段并使用默认的 Jackson 设置将导致缩小的 JSON 响应,这正是我们想要实现的。

这显然会混淆响应,因此将其设置为可选会很棒。对于非生产配置文件,应关闭缩小,而生产配置文件应使用缩小版本。

该应用程序使用 Spring Boot 2(REST + Data(和 Java 8,目前正在使用 Jackson 进行序列化,但这可能会改变。构建是通过Maven完成的。

为此,我们可以使用 Spring 或 Maven 配置文件。

猜测:

  • 删除注释并使用基于配置文件的 bean 配置 Jackson/Gson。不确定是否可能。

  • 杰克逊批注当前未使用。我可以从外部模块中引入自己的实现,并根据配置文件在虚拟和真实模块之间切换,希望我的不会自动配置。肮脏,可能无法正常工作。

  • 复制响应实体,但这很丑陋且难以维护。

无论如何,问题是如何使JSON缩小基于配置,可切换。

缩进不是问题。也许我的问题不清楚。问题是关于缩小字段名称。非产品,我想要"someLongFieldName":1.使用产品配置文件,"s":1。

您可以使用占位符。使用@JsonProperty("${your.property}")而不是@JsonProperty("a")。Spring boot 将计算表达式并将其替换为适当的字符串。

因此,让我们拥有开发和生产配置文件。要禁用开发配置文件的 JSON 缩小,只需添加带有配置的文件应用程序开发属性

spring.jackson.serialization.indent_output=true

或使用 Java 配置:

@Configuration
@Profile("dev")
public class DevJacksonConfig {
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.indentOutput(true);
return builder;
}
}

我不知道你需要做什么,但我认为这是一种代码气味。

根据环境使用不同的密钥(在我们的例子中,dev 和 prod,但它可以有更多(使您的 API 根据环境而不同。但是,内容实际上是相同的。因此,根据部署的 API 配置文件,您将对同一请求有不同的响应。

然后,API 的任何使用者都应该了解混淆密钥的真正含义。更糟糕的是:他们必须处理混淆密钥和"普通"密钥,以便能够与API通信,无论部署了什么配置文件。

它还将使测试和 API 文档生成(招摇等(更加困难。

我强烈建议坚持使用命名良好的键并使用响应压缩(例如 gzip 格式(。

最新更新