Is there a way using Jackson , in a serialization process , to not print 1.the class name (the constructor name) 2.the field name (meaning to print only the field value)
public class Test
{
private static final Logger LOG = Logger.getLogger(Test.class);
/**
* @param args
* @throws IOException
* @throws JsonMappingException
* @throws JsonGenerationException
*/
public void work(final ObjectMapper mapper) throws JsonGenerationException, JsonMappingException, IOException
{
RestrictedAndVat restrictedAndVat = new RestrictedAndVat();
restrictedAndVat.setRate(BigDecimal.valueOf(20));
restrictedAndVat.setRestricted(true);
final CountryRestrictedAndVat countryRestrictedAndVat1 = new CountryRestrictedAndVat();
countryRestrictedAndVat1.setCountryCode("UK");
countryRestrictedAndVat1.setRestrictedAndVat(restrictedAndVat);
final ProductCountryRestrictedAndVat productCountryRestrictedAndVat = new ProductCountryRestrictedAndVat();
final List<CountryRestrictedAndVat> list = new ArrayList<CountryRestrictedAndVat>();
list.add(countryRestrictedAndVat1);
productCountryRestrictedAndVat.setCountryRestrictedAndVat(list);
LOG.info("Json:" + serialiseJson(productCountryRestrictedAndVat, mapper));
}
private <DATA> String serialiseJson(final DATA pojoData, final ObjectMapper mapper)
throws JsonGenerationException, JsonMappingException, IOException
{
final StringWriter jsonWriter = new StringWriter();
mapper.writeValue(jsonWriter, pojoData);
return jsonWriter.toString().trim();
}
}
public class ProductCountryRestrictedAndVat
{
@JsonProperty(value = "crv", required = false)
private List<CountryRestrictedAndVat> countryRestrictedAndVat;
/**
* @return the countryRestrictedAndVat
*/
public List<CountryRestrictedAndVat> getCountryRestrictedAndVat()
{
return countryRestrictedAndVat;
}
/**
* @param countryRestrictedAndVat
* the countryRestrictedAndVat to set
*/
public void setCountryRestrictedAndVat(final List<CountryRestrictedAndVat> countryRestrictedAndVat)
{
this.countryRestrictedAndVat = countryRestrictedAndVat;
}
}
public class RestrictedAndVat
{
@JsonProperty("vat")
@JsonInclude(JsonInclude.Include.NON_NULL)
private BigDecimal rate;
@JsonProperty("restricted")
private boolean restricted;
/**
* @return the rate
*/
public BigDecimal getRate()
{
return rate;
}
/**
* @param rate
* the rate to set
*/
public void setRate(final BigDecimal rate)
{
this.rate = rate;
}
/**
* @return the restricted
*/
public boolean isRestricted()
{
return restricted;
}
/**
* @param restricted
* the restricted to set
*/
public void setRestricted(final boolean restricted)
{
this.restricted = restricted;
}
}
public class CountryRestrictedAndVat
{
@JsonProperty("country")
private String countryCode;
@JsonProperty(value = "rv", required = false)
private RestrictedAndVat restrictedAndVat;
/**
* @return the countryCode
*/
public String getCountryCode()
{
return countryCode;
}
/**
* @param countryCode
* the countryCode to set
*/
public void setCountryCode(final String countryCode)
{
this.countryCode = countryCode;
}
/**
* @return the restrictedAndVat
*/
public RestrictedAndVat getRestrictedAndVat()
{
return restrictedAndVat;
}
/**
* @param restrictedAndVat
* the restrictedAndVat to set
*/
public void setRestrictedAndVat(final RestrictedAndVat restrictedAndVat)
{
this.restrictedAndVat = restrictedAndVat;
}
}
the output is : Json:{"crv":[{"country":"UK","rv":{"vat":20,"restricted":true}}]}
I want it to be : Json:[{"UK":{"vat":20,"restricted":true}}]
Yes, it's possible, using a custom serializer.
Annotate your CountryRestrictedAndVat
class with
@JsonSerialize(using = CountryRestrictedAndVatSerializer.class)
Remove the @JsonProperty
annotations.
And write the serializer:
public class CountryRestrictedAndVatSerializer extends JsonSerializer<CountryRestrictedAndVat> {
@Override
public void serialize(CountryRestrictedAndVat value,
JsonGenerator gen,
SerializerProvider serializers) throws IOException, JsonProcessingException {
gen.writeStartObject();
gen.writeObjectField(value.getCountryCode(), value.getRestrictedAndVat());
gen.writeEndObject();
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.