Java 将手动创建的JSONObject的内容传递给Jackson

Java 将手动创建的JSONObject的内容传递给Jackson,java,json,jackson,Java,Json,Jackson,如果我想得到实体的databaseentry,我会得到正确的结果,但是这个结果有换行符,我不想有。我想要的是这个(一个jsonfile): 但我得到的是: {"institution":["{\r\n \"id\" : 20706,\r\n \"name\" : \"Ecole des Ponts ParisTech\",\r\n \"institution_type\" : {\r\n \"id\" : 2,\r\n \"name\" : \"Research facilit

如果我想得到实体的databaseentry,我会得到正确的结果,但是这个结果有换行符,我不想有。我想要的是这个(一个jsonfile):

但我得到的是:

{"institution":["{\r\n  \"id\" : 20706,\r\n  \"name\" : \"Ecole des Ponts ParisTech\",\r\n  \"institution_type\" : {\r\n    \"id\" : 2,\r\n    \"name\" : \"Research facility\"\r\n  },
我的代码是:

ObjectMapper objectMapper = ObjectMapperFactory.getObjectMapper();
EditorialDAO dao = EditorialManager.dao();
    String valueValue = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(dao.get(Institution.class,20706));
是的,我想要一根线,但不能用换行符和\来代替我的”

My ObjectMapper声明如下:

ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setSerializationInclusion(Include.NON_NULL);
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    objectMapper.disable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS);
    objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    objectMapper.configure(SerializationFeature.EAGER_SERIALIZER_FETCH, true);
    objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
编辑: 获取valueValue后的下一个代码:

String response = objectMapper.writeValueAsString(dao.get(Basic.class, 323));
                JSONObject jsonObject = new JSONObject(response);       
                jsonObject.put(institution, valueValue);
                response = jsonObject.toString();
                dao.merge(objectMapper.readValue(response, Basic.class));
如果尝试合并,则会出现以下错误:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of Institution: no String-argument constructor/factory method to deserialize from String value();
我没有得到什么:我只是将数据库中的输入准确地放入JSON中,我的Basic.class实体的类型为Institution

@Entity
@JsonInclude(Include.NON_EMPTY)
public class Basis implements{

    @Id
    @SortableField
    @SequenceGenerator(name = "basis_generator", sequenceName = "basis_id_basis_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "basis_generator")
    @Column(name="id_basis")
    @JsonView(View.Minimal.class)
    private int id;

    @ManyToOne
    @NotFound(action=NotFoundAction.IGNORE)
    @JsonView(View.Minimal.class)
    @JoinColumn(name="id_institution")
    private Institution institution;

此问题的解决方案是不要将
valueValue
直接传递给
jsonObject
。相反,它需要是自己的
jsonObject

JSONObject jsonObject = new JSONObject(response);       
jsonObject.put(institution, new JSONObject(valueValue));


直接传递json值将导致以下输出,其中引号被转义,并在值周围添加了额外的引号。 这种方式只能用于基本类型

{"institution":"{\"id\":20706,\"name\":\"Ecole des Ponts ParisTech\",\"institutionType\":{\"id\":2,\"name\":\"Research facility\"}}","id":1}


如果包装到一个新的
JsonObject
,结果就是一个正确的表示,而
jackson
可以处理这个表示

{"institution":{"name":"Ecole des Ponts ParisTech","institutionType":{"name":"Research facility","id":2},"id":20706},"id":1}

附言:
原始字符串是否为漂亮的打印格式并不重要。

@second不准确。值之间的空格没有意义。OP,看起来您正在映射器中运行字符串两次。请使用更多信息进行编辑。@chrylis onstrike-是的,您是对的。标准将其描述为无关紧要。但是如果OP uses pretty print(和/或
INDENT_OUTPUT
)将添加换行符和缩进。我将INDENT_OUTPUT设置为false,并立即删除预打印程序。从dao获取此信息后,它会工作。但如果我将其添加到jsonobject,换行符仍然可用:/
{"institution":{"name":"Ecole des Ponts ParisTech","institutionType":{"name":"Research facility","id":2},"id":20706},"id":1}