Java 将手动创建的JSONObject的内容传递给Jackson
如果我想得到实体的databaseentry,我会得到正确的结果,但是这个结果有换行符,我不想有。我想要的是这个(一个jsonfile): 但我得到的是: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
{"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}