【问题标题】:Java Webclient: How to serialize to Pascal JSON?Java Webclient:如何序列化为 Pascal JSON?
【发布时间】:2020-03-02 16:42:27
【问题描述】:

我正在尝试与另一个具有非常具体的集成参数的系统进行交互。他们没有编写任何代码来忽略大小写敏感性,长话短说,对于我试图发出的一个帖子请求,他们期望一个 JSON 正文,其字段名称为 Pascal 大小写而不是 Camel Case,并且请求在没有 Pascal 的情况下失败.我们正在使用 WebClient 发送集成调用,因此我们可以在代码中支持响应式流。据我所知,当我使用 WebClient 序列化为 JSON 时,请求被转换为使用 Camel Case,这是我通常想要的。

如何将其序列化为 Pascal?我尝试研究的所有内容最终都会让我进入 .NET 领域,但我不是用 C# 编写的。我是用 Java 写的。

//For example:
{"originTypeCode":"US","camelCaseFieldName":"FAILED"}     // FAILURE
{"OriginTypeCode":"US","PascalFieldName":"SUCCESS"}       // SUCCESS

我有两个想法:

1) 这似乎不太理想,但可能更直观。这个想法是先将我要发布的对象转换为 JSON,然后使用解析器将所有字段从 Camel Case 转换为 Pascal,然后尝试使用我的 WebClient 方法发布。这似乎不是最理想的方法。我想可能会有更清洁的东西。

2) 第二个想法是我的 WebClient 实例使用 Jackson 序列化程序进行序列化。我想如果我要创建一个新的 WebClient/Jackson ObjectMapper Bean,也许我可以编写一个自定义转换器来专门用于这个集成流程。这看起来可能更干净,但是通过 WebClient 及其构建方法进行挖掘,很难弄清楚如何实现这一点。下面我发布了我当前定义的bean。深入研究这种东西对我来说很新鲜,所以我不确定需要改变什么或在哪里改变。 WebClient bean 来自 WebClientConfig 类,ObjectMapper 来自我的 JacksonConfig 类。

@Bean
public WebClient webClient() {
    return WebClient.builder().clientConnector(getClientHttpConnector()).build();
}

@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.createXmlMapper(false).build();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    return objectMapper;
}

我当然也愿意接受其他建议。

【问题讨论】:

标签: java json webclient pascal


【解决方案1】:

@GriffeyDog 的 cmets 帮助我弄清楚了我需要做什么。对于偶然发现此问题的任何人,解决方案如下:

如果您希望某些类以特定方式序列化,您可以使用注解@JsonNaming 对类本身进行注解,然后指定命名策略,其列表可以在这里找到:https://java-focus.com/jackson-property-naming-strategy/。对于我的用例,我使用了 PropertyNamingStrategy.UpperCamelCaseStrategy。

@JsonNaming(value = PropertyNamingStrategy.UpperCamelCaseStrategy.class)
public class MyPascalSerializedClass {}
//All fields in this class will serialize to "UpperCamelCase" instead of "normalCamelCase".

另外,如果你想指定某些字段,你可以使用@JsonProperty 注解来覆盖类注解。例如,我的班级中有一个字段必须映射到不符合任何标准约定的 JSON 格式,所以我可以使用它。

@JsonProperty("ULDNumber")
private String uldNumber
//This field will serialize to the specified "ULDNumber".

这都是 com.fasterxml.jackson 库的一部分。有关更多文档,您可以参考上面的链接和以下链接:https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/PropertyNamingStrategy.UpperCamelCaseStrategy.html

【讨论】:

    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    相关资源
    最近更新 更多