当前位置: 首页 > 知识库问答 >
问题:

Jackson:防止序列化通过序列化hashmap获得的json字符串

万俟经纶
2023-03-14

我的问题类似于防止GSON序列化JSON字符串,但是那里的解决方案使用GSON库,而我仅限于使用Jackson(fasterxml)。

我有一个实体类,如下所示:

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;
    }
}

我想用映射的json字符串表示填充body字段,然后将其作为ResponseEntity的一部分发送。如下事物:

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);

预期输出:“{”requesttype“:”常规查询“,”body“:”{“query”:“如何使用Jackson双序列化字符串解决问题?”,“phone”:“+12345677890”}“}

实际输出:“{”requesttype“:”常规查询“,”body“:”{\“查询\”:\“如何解决Jackson字符串双序列化问题?\”,\“phone\”:\“+12345677890\”}“}

我在用

Jackson Core v2.8.2

标记,但这没有帮助,因为我的字段在写入实体时已经从映射序列化了。

共有1个答案

荆学民
2023-03-14

@jsonrawvalue注释添加到body属性中。这使得Jackson将该属性的内容视为不应处理的文字JSON值。

请注意,Jackson不对字段的内容进行任何验证,这使得生成无效的JSON变得危险。

 类似资料:
  • 我想进一步说明这个问题是关于什么的,我已经漫游了一个小时了,但没有找到任何东西。 更糟糕的是,正如您所看到的,该属性是final(这就是为什么我热衷于通过反序列化在实例化时使用Jackson反射能力)。我已经阅读了关于以不同的方式注释setter和getter的潜在解决方案,但如果可能的话,我希望将此属性保留为最终属性。如果不可能,我会接受一个非最终财产。 我希望答案不建议自定义序列化/反序列化,

  • 我使用Json-Jackson序列化/反序列化我的对象,并且与内置类配合得很好。 字符串、int等非常好。但是现在我必须序列化/反序列化以特定方式构建的对象。遵循声明: 如果我使用标准的序列化器/反序列化,它会向我显示一条错误消息,例如“java.lang.不支持的操作异常...”,因此它无法序列化/反序列化bobjs。 我如何以一般方式做到这一点,所以我不写3个序列化器/反序列化器,而是只告诉J

  • 问题内容: 当尝试使用Jackson序列化一个非常简单的对象时,出现异常。错误: org.codehaus.jackson.map.JsonMappingException:未找到类MyPackage.TestA的序列化程序,也未发现创建BeanSerializer的属性(为避免异常,请禁用SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)) 以下是要

  • 问题内容: 类型1(docs链接): 类型2(docs链接): 尽管以上两种类型都能完成任务,但这些实现之间有什么区别? 问题答案: 构造之后,两者都调用相同的反序列化功能,因此唯一的区别是泛型类型的处理方式。 第二个是完全静态的,因此类型必须在编译类型中是已知的,并且不能改变。因此,它类似于使用基本Class文字。 第一个是动态的,因此可以用于构造因其参数设置而变化的事物。 就我个人而言,我更喜

  • 我希望获得以下输出:(我所要做的就是删除字段名,但保留其子字段名。) 以下是我的POJO,由使用: 下面是MAP在搜索过程中使用的我的: null 是否有一种方法可以使它与和一起使用,因为我不能同时使用这两种方法。 有人能帮忙解决这个问题吗?请指导我适当的文档或变通方法,非常感谢。

  • 问题内容: 在Apache Jackson和Jackson一起使用Apache Jersey进行JSON序列化时(在服务器和客户端上),在反序列化通用List时遇到问题。 我正在生成的JSON如下,“数据”中的所有3个类都实现“ CheckStatusDetail”: 产生此JSON的对象如下所示,我在客户端使用相同的类: 自从我将此注释添加到我的CheckStatusDetail接口后,就应用了