Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

228
Views
Jackson custom annotation for custom value serialization

I'm trying to create custom jackson annotation that would affect serialization value.

Meaning:

class X {
@Unit("mm") int lenght;
 ...
}

Now serializaling object X(10) would result in:

{
  "lenght" : "10 mm"
}

How can I achieve that?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

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

// Create own annotation storing your unit value

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@interface Unit {
    String value();
}

// Create custom serializer checking @Unit annotation

class UnitSerializer extends StdSerializer<Integer> implements ContextualSerializer {

    private String unit;

    public UnitSerializer() {
        super(Integer.class);
    }

    public UnitSerializer(String unit) {
        super(Integer.class);
        this.unit = unit;
    }

    @Override
    public void serialize(Integer value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        jgen.writeString(String.format("%d %s", value, unit));
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
        String unit = null;
        Unit ann = null;
        if (property != null) {
            ann = property.getAnnotation(Unit.class);
        }
        if (ann != null) {
            unit = ann.value();
        }
        return new UnitSerializer(unit);
    }
}

@NoArgsConstructor
@AllArgsConstructor
@Data
class X {
    @JsonSerialize(using = UnitSerializer.class)
    @Unit("mm")
    private int length;
}

public class Runner {
    public static void main(String[] args) throws JsonProcessingException {

        X x = new X(10);
        ObjectMapper objectMapper = new ObjectMapper();
        System.out.println(objectMapper.writeValueAsString(x));
    }
}

Result:

{"length":"10 mm"}
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!