将 JSON 反序列化为类实例

我有一个通过 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(){}

}

在接收方服务上:


@Document

public 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"

}

我在这里做错了什么?

四季花海
浏览 116回答 4
4回答

慕娘9325324

它看起来像我为 Kafka 看到的行为,因为你也在使用 Spring 我认为它是相同的。您的发送端将对象转换为 Json,然后将其作为字符串发送 - 因此错误消息 () 中的转义引号\"nome\": \"John\",\n\t\t\t\"cognome\": \"Doe\"。您需要在发送方声明 JsonSerializer 然后将其传递给您User,或者 - 如果您手动创建 Json String - 声明它是一个字节数组,这样 Spring 就不会尝试转义引号和空格。

慕田峪9158850

看起来您正在对 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; });

慕田峪7331174

终于找到了导致您发布的堆栈跟踪的匹配输入问题是您对 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其他地方的一些干扰。

偶然的你

您可能可以编写复杂的自定义 JSON 配置,但最简单的解决方案是将您的消息反序列化回类,User然后向您的Persona类添加一个构造函数,该构造函数将idclassUser作为参数
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java