Skip to content

Add @JsonKey annotation. #179

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

Merged
merged 3 commits into from
Nov 2, 2020
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions src/main/java/com/fasterxml/jackson/annotation/JsonKey.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.fasterxml.jackson.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* Marker annotation
* that indicates that the value of annotated accessor (either field
* or "getter" method [a method with non-void return type, no args])
* is to be used as the single value to serialize for the instance.
* This value will be used only if the instance is being serialized
* as a key in a Map type.
* Usually value will be of a simple scalar type
* (String or Number), but it can be any serializable type (Collection,
* Map or Bean).
*<p>
* At most one accessor of a <code>Class</code> can be annotated with this annotation;
* if more than one is found, an exception may be thrown.
* Also, if method signature of annotated method is not compatible with Getters,
* an exception may be thrown (whether exception is thrown or not is an
* implementation detail (due to filtering during introspection, some annotations
* may be skipped) and applications should not rely on specific behavior).
*<p>
* A typical usage is that of annotating <code>toString()</code>
* method so that returned String value is used as the JSON serialization;
* and if deserialization is needed, there is matching constructor
* or factory method annotated with {@link JsonCreator} annotation.
*<p>
* Boolean argument is only used so that sub-classes can "disable"
* annotation if necessary.
*<p>
* NOTE: when use for Java <code>enum</code>s, one additional feature is
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably needs to be removed for now

* that value returned by annotated method is also considered to be the
* value to deserialize from, not just JSON String to serialize as.
* This is possible since set of Enum values is constant and it is possible
* to define mapping, but can not be done in general for POJO types; as such,
* this is not used for POJO deserialization.
*
* @see JsonCreator
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure @JsonCreator handling would be yet supported either.

* @see JsonValue
*/
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD,
ElementType.FIELD
})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonKey
{
/**
* Optional argument that defines whether this annotation is active
* or not. The only use for value 'false' if for overriding purposes.
* Overriding may be necessary when used
* with "mix-in annotations" (aka "annotation overrides").
* For most cases, however, default value of "true" is just fine
* and should be omitted.
*/
boolean value() default true;
}
5 changes: 5 additions & 0 deletions src/main/java/com/fasterxml/jackson/annotation/JsonValue.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,13 @@
* This is possible since set of Enum values is constant and it is possible
* to define mapping, but can not be done in general for POJO types; as such,
* this is not used for POJO deserialization.
*<p>
* NOTE: When the instance is being serialized as the key of a Map type,
* this will be ignored if an accessor is annotated with
* {@link JsonKey}.
*
* @see JsonCreator
* @see JsonKey
*/
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD,
ElementType.FIELD // since 2.9
Expand Down