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

Spring boot,序列化和反序列化时Jackson Json问题

阎兴为
2023-03-14

对于某些用例,我需要将一个POJO转换为另一个具有不同字段名称的POJO。我试着使用Jackson对象映射器。它在某些方面起了作用。然而,最终的结果并不是我所期望的。

public class JacksonTest {

    public static void main(String[] args) throws IOException{
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("Deepak", "111", "Singapore");
        UserMap newUser = mapper.convertValue(user, UserMap.class);
        System.out.println("SOUT: " + newUser);
        System.out.println("Jackson: " + mapper.writeValueAsString(newUser));
    }
}

class User {

    User(String name, String id, String address){
        this.name = name;
        this.id = id;
        this.address = address;
    }

    String name;
    String id;
    String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

class UserMap implements Serializable {
    @JsonProperty("name")
    String name;

    private Map<String, Object> meta = new HashMap<>();

    @JsonAnyGetter
    public Map<String, Object> any() {
        return meta;
    }

    @JsonAnySetter
    public void set(String name, Object value) {
        meta.put(name, value);
    }

    @Override
    public String toString() {
        return "UserMap{" +
                "name_new='" + name + '\'' +
                ", meta=" + meta.keySet().stream().map(x-> x+ ":: "+ meta.get(x)).collect(Collectors.joining(", ")) +
                '}';
    }
}

如果运行,输出将是:

SOUT:UserMap{name_new='Deepak',meta=address::Singapore,id::111}

杰克逊:{“姓名”:“迪帕克”,“地址”:“新加坡”,“身份证”:“111”}

我使用的是内部使用jackson序列化程序的Springboot。它再次将newUser对象转换为普通用户类。我想以类构造的方式序列化字符串。我想要SOUT格式的输出。

共有2个答案

庄嘉
2023-03-14

我无法使用默认的Spring boot bean实现自动序列化和反序列化。最后,在加入了Lombok项目和apache BeanUtils之后,这对我来说非常有效:

@ToString() @Getter() @Setter() @NoArgsConstructor()
public class User {
    private String email;
    private String bio;
    private String image;
    private String displayName;
    private String userId;
    private long lat;
    private long lng;

    public User(String json) throws JsonParseException, JsonMappingException, IOException, IllegalAccessException, InvocationTargetException {
        ObjectMapper om = new ObjectMapper();
        User u = om.readValue(json, User.class);
        BeanUtils.copyProperties(this, u);
    }
}

http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgihttps://projectlombok.org/

寇和璧
2023-03-14

我想你误解了@JsonAnyGetter/@JsonAnySetter这对组合实际上会做什么。

它允许您创建一个几乎动态的bean,其中包含必填字段和自愿性字段。在您的情况下,名称是强制性的,其他所有字段都是自愿的。

幕后发生的事情并不是你的UserMap被转换成用户。您看到的是一个序列化的UserMap,但由于它与相应的用户实例具有相同的字段和值,因此它们的序列化形式看起来是相同的。

 类似资料:
  • 问题内容: 每当我尝试序列化文件时,都会收到错误消息:FileNotFound。不知道为什么。这是我的FileHelper代码: 问题答案:

  • 问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加

  • 问题内容: Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然? 例如,如果我有这个结构: 我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象? 问题答案: 使用gob和base64可以解决问题,例如: 当您需要序列化自定义结构或类型(例如struct)时,只需添加以下行:

  • 主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台

  • 目前,我正在使用Avro1.8.0序列化/反序列化对象,但面临一些问题,特别是java.util.Map对象。不面临其他类型对象的问题。 这里的示例代码- 在deserialize方法中,我试图根据输入数据获取模式,但avro抛出错误- 多谢了。

  • 好的,我做了更改,下面是我得到的JSON响应 它现在导致一个嵌套异常是java.lang.IllegalArgumentException:参数类型不匹配 NestedServletException:请求处理失败;嵌套异常是java.lang.IllegalArgumentException:参数类型不匹配org.springframework.web.servlet.framework.ser