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

将JSON反序列化为类实例

须鸿祯
2023-03-14

我有一个通过RabbitMQ作为消息发送的类,在sender服务上,它的定义如下:

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(){}
}

在receiver controller中,我有以下方法,它应该接受该消息,将其转换为一个对象,并将其保存在数据库中,看起来如下所示:

@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");
    }
{
  'nome': "John",
  'cognome': "Doe"
}

编辑:根据请求添加堆栈跟踪。

共有1个答案

张宣
2023-03-14

这看起来就像我看到的Kafka的行为,因为你也使用了Spring,我想也是一样的。

发送端将对象转换为Json,然后将其作为字符串发送--因此错误消息中会出现转义引号(\“nome\”:\“john\”,\n\t\t\t\“cognome\”:\“doe\”)。

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

 类似资料:
  • 问题内容: 我正在尝试创建类实例的JSON字符串表示形式并且遇到困难。假设该类的构建如下: 像这样对json.dumps进行调用: 失败了,并告诉我testclass不可JSON序列化。 我也尝试过使用pickle模块: 它提供类实例信息,但不提供类实例的序列化内容。 我究竟做错了什么? 问题答案: 基本问题是,JSON编码器仅知道默认情况下如何序列化一组有限的对象类型(所有内置类型)。在此处列出

  • 问题内容: 我在这里发现了同样的问题… …但是没有正确的答案。 最好的建议之一是将嵌套对象包装到新类中,但是这种方法引入了另一个问题:乐高名称。 在我的示例中,此类的最逻辑名称是与父类相同的名称,当然这是不可能的。我的示例很简单,我只想消除父类中的“语言”属性。有人可以帮我做吗? json的示例: 问题答案: 如果JSON属性名称与c#命名约定冲突,则可以在序列化期间使用或批注替换其他名称。 例如

  • 问题内容: 我在反序列化一些json数据,获取InvalidCastExceptions之类的问题。 谁能指出我正确的方向? 这是我要反序列化的json; [{“ OrderId”:0,“名称”:“摘要”,“ MaxLen”:“ 200”},{“ OrderId”:1,“名称”:“详细信息”,“ MaxLen”:“ 0”}] 这是我的代码; 问题答案: OrderId是json中的一个Int(请注

  • 我正在调用一个返回JSON的endpoint,它看起来像这样(在Postman中): 此请求返回的Content-Type头是(与通常的 类来自外部库(编写这个endpoint的人)。无论如何,当我试图通过< code > rest template . exchange()调用这个endpoint时,Jackson都无法将这个JSON反序列化为一个有效的< code>Result类。我正在这样做

  • 它提供类实例信息,但不提供类实例的序列化内容。 我做错了什么?

  • 问题内容: 使用Jackson 2,我正在寻找一种 通用的 方式将对象序列化为单个值(然后序列化它们,然后再填充该单个字段),而不必重复创建JsonSerializer / JsonDeserializer来处理每种情况。@JsonIdentityInfo批注非常接近,但由于我知道,它将始终对完整的子对象进行序列化,因此略微遗漏了该标记。 这是我想做的一个例子。给定的类: 我希望Order可以序列