1

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.

Community
  • 1
  • 1
DPancs
  • 588
  • 6
  • 14
  • You expected output can not be parsed by all browsers, are you sure this is what you want? – PWC May 12 '17 at 01:04
  • I am not returning to a browser but to a third party solution that wants data in this particular format. – DPancs May 12 '17 at 18:46

1 Answers1

5

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.

Henrik Aasted Sørensen
  • 6,966
  • 11
  • 51
  • 60