为了账号安全,请及时绑定邮箱和手机立即绑定

将 JSON 反序列化为类实例

将 JSON 反序列化为类实例

四季花海 2023-04-26 15:42:48
我有一个通过 RabbitMQ 作为消息发送的类,在发件人服务上,它定义如下:public final class User implements Serializable {    private String nome;    private String cognome;    public User(@JsonProperty("nome") String nome,                @JsonProperty("cognome") String cognome) {        this.nome = nome;        this.cognome = cognome;    }    public String getNome() {        return nome;    }    public String getCognome() {        return cognome;    }    public User(){}}在接收方服务上:@Documentpublic class Persona {    @Id    @JsonProperty    public ObjectId id;    private String nome;    private String cognome;    public String getId() {        return id.toHexString();    }    public void setId(ObjectId id) {        this.id = id;    }    public String getNome() {        return nome;    }    public void setNome(String nome) {        this.nome = nome;    }    public String getCognome() {        return cognome;    }    public void setCognome(String cognome) {        this.cognome = cognome;    }    public Persona(ObjectId id, String nome, String cognome) {        this.id = id;        this.nome = nome;        this.cognome = cognome;    }    public Persona(){}}在接收器控制器中,我有以下方法,它应该获取该消息,将其转换为一个对象,并将其保存在数据库中,它看起来像:@RabbitListener(queues = {"default_parser_q"})    public void receiveMessage(final Message message){        ObjectMapper mapper = new ObjectMapper()                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)                .configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);        mapper.readValue(message.getBody(), Persona.class);        System.out.println(message.toString() + "the message has been received");    }问题是我在该readValue()方法上遇到异常,特别是:未处理的异常:java.io.IOException、com.fasterxml.jackson.core.JsonParseException、com.fasterxml.jackson.databind.JsonMappingException在这种情况下发送的消息 (JSON) 是:{  'nome': "John",  'cognome': "Doe"}我在这里做错了什么?
查看完整描述

4 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

它看起来像我为 Kafka 看到的行为,因为你也在使用 Spring 我认为它是相同的。

您的发送端将对象转换为 Json,然后将其作为字符串发送 - 因此错误消息 () 中的转义引号\"nome\": \"John\",\n\t\t\t\"cognome\": \"Doe\"

您需要在发送方声明 JsonSerializer 然后将其传递给您User,或者 - 如果您手动创建 Json String - 声明它是一个字节数组,这样 Spring 就不会尝试转义引号和空格。


查看完整回答
反对 回复 2023-04-26
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

看起来您正在对 JSON 进行“双重”编码。


如果您使用 发送 JSON 字符串RabbitTemplate,则不应使用 JSON 消息转换器,因为它会重新编码已经编码的 JSON。


要么使用template.send(msg)(设置messageProperties.contentType()为application/json),要么如果使用,则在模板中convertAndSend()使用 a并SimpleMessageConverter


 template.convertAndSend(exchange, rk, myJsonStrng, msg -> {

        msg.getMessageProperties().setContentType("application/json");

        return msg;

 });


查看完整回答
反对 回复 2023-04-26
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

终于找到了导致您发布的堆栈跟踪的匹配输入

问题是您对 jackson 映射器的输入是这样的:

\"{\\n\\t\\t\\t\\\"nome\\\": \\\"John\\\",\\n\\t\\t\\t\\\"cognome\\\": \\\"Doe\\\"\\n\\t\\t}\"

杰克逊认为这是一个单一的价值,但未能将其映射到创造者身上。

正确的输入看起来像这样

{\n\t\t\t\"nome\": \"John\",\n\t\t\t\"cognome\": \"Doe\"\n\t\t}

正如@daniu发布的那样,这可能是由于Spring其他地方的一些干扰。


查看完整回答
反对 回复 2023-04-26
?
偶然的你

TA贡献1841条经验 获得超3个赞

您可能可以编写复杂的自定义 JSON 配置,但最简单的解决方案是将您的消息反序列化回类,User然后向您的Persona类添加一个构造函数,该构造函数将idclassUser作为参数



查看完整回答
反对 回复 2023-04-26
  • 4 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信