Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] Using Jackson Annotations simultaneously: @JsonNaming @JsonAlias #187

Open
the-codinator opened this issue Apr 13, 2021 · 4 comments

Comments

@the-codinator
Copy link

the-codinator commented Apr 13, 2021

Java: 11.0.10
Jackson: 2.12.2

We currently have all fields returned by an API in kebab case (eg: first-name), which wants to convert to camel case for consistency with other systems (eg: firstName).

This is obviously a breaking change, so the right way to do it would be the API including both versions of the field (kebab + camel), giving sufficient time for folks to migrate from the deprecated key name, and then removing the deprecated fields.

As an improvement, to further decouple the API and consumer applications, it would be great to have this support added to JsonNaming or JsonAlias

Currently, we have @JsonNaming(PropertyNamingStrategies.KebabCaseStrategy.class) at the top of our class to have all fields being deserialized from kebab case. Maybe JsonNaming can take another param aliasStrategies = {AliasStrategy1.class, AliasStrategy2.class} to indicate alternate naming pattern as aliases only, i.e. both naming conventions should be permitted for deserialization (default, or aliased), while serialization would continue to use the primary convention.

An alternative would be to allow @JsonAlias to be applied at the class level, with a PropertyNamingStrategy as its value instead.

Or if its not a good idea fitting this into existing annotations, create a JsonNamingAlias which can be used like the following:

@JsonNaming(MainPropertyNamingStrategyUsedForSerializationAndDeserialization.class)
@JsonNamingAlias(PropertyNamingStrategies.KebabCaseStrategy.class)
@JsonNamingAlias(AnotherStrategy.class)
class MyPojo {
  public String firstName;
}

If there are fields in the json to be deserialized which point to the same key with different naming formats (eg: {"first-name": "codi1", "firstName": "codi2"}, then just follow what happens when JsonAlias are applied to a field with multiple aliases (I believe the precedence is actual property name (or JsonProperty if present) followed by first matched alias)

@the-codinator
Copy link
Author

@cowtowncoder tagging you since I think its a good feature to add and don't want to lose it out due to inactivity...

Apologies if you felt this tag to draw attention was spam (let me know and I'll refrain henceforth).

@cowtowncoder
Copy link
Member

If anyone has time & interest they are free to propose an implementation. This sounds like a rather complicated thing to implement so I don't really have time to look into it any further myself, but maybe someone else has.

@the-codinator
Copy link
Author

Got it. I'll take a stab at this pretty soon...

@cowtowncoder
Copy link
Member

Makes sense! Adding of new annotation is simple enough; next step would be to add API method in AnnotationIntrospector.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants