DPancs
DPancs

Reputation: 617

Jackson: Prevent serialization of json string obtained by serializing a hashmap

My question is kind of similar to Prevent GSON from serializing JSON string but the solution there uses GSON library and I am restricted to using Jackson (fasterxml).

I have an entity class as follows:

package com.dawson.model;

import com.dawson.model.audit.BaseLongEntity;
import lombok.extern.log4j.Log4j;

import javax.persistence.*;

@Table(name = "queue", schema = "dawson")
@Entity
@Log4j
public class Queue extends BaseLongEntity {
    protected String requestType;
    protected String body;

    protected Queue() {
    }

    public Queue(String requestType, String body) {
        this.requestType = requestType;
        this.body = body;
    }

    @Column(name = "request_type")
    public String getRequestType() {
        return requestType;
    }

    public void setRequestType(String requestType) {
        this.requestType = requestType;
    }

    @Column(name = "body")
    @Lob
    public String getBody() {
        return body;
    }
    public void setBody(String body) {
        this.body = body;
    }
}

I want to populate the body field with the json string representation of a map and then send this as part of the ResponseEntity. Something as follows:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.writer().withDefaultPrettyPrinter();

HashMap<String, String> map = new HashMap<>(5);
map.put("inquiry", "How Can I solve the problem with Jackson double serialization of strings?");
map.put("phone", "+12345677890");
Queue queue = null;
try {
    queue = new Queue("General Inquiry", mapper.writeValueAsString(map));
} catch (JsonProcessingException e) {
    e.printStackTrace();
}

String test = mapper.writeValueAsString(map)
System.out.println(test);

Expected Output: "{"requestType": "General Inquiry","body": "{"inquiry":"How Can I solve the problem with Jackson double serialization of strings?","phone":"+12345677890"}"}"

Actual Output:"{"requestType": "General Inquiry","body": "{\"inquiry\":\"How Can I solve the problem with Jackson double serialization of strings?\",\"phone\":\"+12345677890\"}"}"

I am using

Jackson Core v2.8.2

I tried playing with

@JsonIgnore

and

@JsonProperty

tags but that doesn't help because my field is already serialized from the map when writing to the Entity.

Upvotes: 2

Views: 1821

Answers (1)

Add the @JsonRawValue annotation to the body property. This makes Jackson treat the contents of the property as a literal JSON value, that should not be processed.

Be aware that Jackson doesn't do any validation of the field's contents, which makes it dangerously easy to produce invalid JSON.

Upvotes: 6

Related Questions