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

问题描述 投票:3回答:3

有了杰克逊,一个字段上的注释@JsonProperty("a")会将其名称序列化为a。有了Gson,这就像@SerializedName("a")一样。

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

这显然会使响应变得模糊,因此将其作为可选项会很好。对于非生产配置文件,应关闭缩小,而生产配置文件应使用缩小版本。

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

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

猜测:

  • 删除注释并使用基于配置文件的bean配置Jackson / Gson。不确定是否可能。
  • Jackson Annotations目前尚未使用。我可以从外部模块投入我自己的实现,并根据配置文件在虚拟和真实之间切换,希望我的不会自动配置。脏,可能无法正常工作。
  • 复制响应实体,但这很丑陋且难以维护。

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

java json spring jackson
3个回答
1
投票

缩进不是问题。也许我的问题不明确。问题是关于缩小字段名称。非产品,我想要“someLongFieldName”:1。使用prod配置文件,“s”:1。

您可以使用占位符。使用@JsonProperty("${your.property}")而不是@JsonProperty("a")。 Spring引导将评估表达式并用适当的String替换它。


0
投票

那么,让我们有dev和prod配置文件。要禁用JSON缩小开发配置文件,只需使用config添加文件application-dev.properties:

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;
    }
}

0
投票

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

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

然后,API的任何消费者都应该知道混淆密钥的真正含义。更糟糕的是:无论使用什么配置文件,他们都必须处理混淆和“正常”密钥以便能够与API通信。

它还将使测试和API doc生成(swagger等)变得更加困难。

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

© www.soinside.com 2019 - 2024. All rights reserved.