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

使用Jackson序列化和反序列化针对JAVA类的JSON

丘浩宕
2023-03-14

试图将JSON反序列化为我创建的Java bean。对杰克逊和这项努力来说真的很新鲜,所以请容忍我。我有以下几点:

{
  "foo": {
    "firstBlock": {
      "myValue": 1,
      "someBool": true,
      "stringValue": "OK"
    },
    "anotherBlock": {
      "values": [
        {
          "yikes01": 42
        },
        {
          "yikes02": 215
        }
      ],
      "myInt": 64,
      "logging": "Yes"
    }
  }
}

由于JSON中的对象被反复使用,我的Java Bean被分解为几个部分,因此:

@JsonRootName("foo")
public class FooBean {
  private FirstBlockBean firstBlock;
  private AnotherBlockBean anotherBlock;

  @JsonGetter("firstBlock")
  public FirstBlockBean getFirstBlock() { return firstBlock; }

  @JsonSetter("firstBlock")
  public void setFirstBlock(FirstBlockBean firstBlock) { this.firstBlock = firstBlock; }

  @JsonGetter("anotherBlock")
  public AnotherBlockBean getAnotherBlock() { return anotherBlock; }

  @JsonSetter("firstBlock")
  public void setAnotherBlock(AnotherBlockBean anotherBlock) { this.anotherBlock = anotherBlock; }
}

@JsonRootName("firstBlock")
public class FirstBlockBean {

  private int myValue;
  private Boolean someBool;
  private String stringValue;

  @JsonGetter("myValue")
  public int getMyValue() { return myValue; }

  @JsonSetter("myValue")
  public void setMyValue(int myValue) { this.myValue = myValue; }

  @JsonGetter("someBool")
  public Boolean getSomeBool() { return someBool; }

  @JsonSetter("someBool")
  public void setSomeBool(Boolean someBool) { this.someBool = someBool; }

  @JsonGetter("stringValue")
  public String getStringValue() { return stringValue; }

  @JsonSetter("someBool")
  public void setStringValue(String stringValue) { this.stringValue = stringValue; }
}

...和以类似方式实现的另一个BlockBean类(为简洁起见省略)。我使用杰克逊来完成这个任务,我的问题是——杰克逊中是否有序列化和反序列化的机制?理想情况下,我想要这样的东西(下面是伪代码,因为我无法通过谷歌搜索或这里的搜索来显示任何东西):

// Assume "node" contains a JsonNode for the tree and foo is an uninitialized FooBean class object.
JsonHelper.deserialize(node, FooBean.class, foo);

此时,我可以读回这些值:

int i = foo.getFirstBlock().getMyValue();
System.out.println("i = " + i); // i = 1

类似地,我希望能够获取foo实例,并使用另一种方法将其序列化回JSON。我的梦想是想要这种内置功能,还是它真的存在?

共有1个答案

鄂琛
2023-03-14

使用Jackson时的主要类是ObjectMapper。它有很多选项,看看可用的方法。

这是一个典型的帮助器类的示例,它使用ObjectMapper在Java对象和字符串之间进行转换。

public class JsonHelper {

    private ObjectMapper objectMapper;

    public JsonHelper(){

        this.objectMapper = new ObjectMapper();

        // Your mapping preferences here
        this.objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
        this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        this.objectMapper.setSerializationInclusion(Include.NON_NULL);
        this.objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
    }

    public String serialize(Object object) {
        try {
            return this.objectMapper.writeValueAsString(object);
        } catch (Exception e) {
            // TODO Handle exception
            return null;
        }
    }

    public <T> T deserialize(String json, Class<T> clazz) {
        try {
            return this.objectMapper.readValue(json, clazz);
        } catch (Exception e) {
            // TODO Handle exception
            return null;
        }
    }

    public <T> T deserialize(String json, TypeReference<T> valueTypeRef) {
        try {

            return this.objectMapper.readValue(json, valueTypeRef);
        } catch (Exception e) {
            // TODO Handle exception
            return null;
        }
    }
}

一些提示:

  • 如果getter和setter方法的名称遵循通常的约定,您可以省略@JsonGetter和@JsonSetter注释,只在字段声明中使用@JsonProperty注释
  • 如果java字段的名称等于JSON中的节点名称,也可以省略@JsonProperty注释(Jackson将映射JSON节点和Java具有匹配名称的字段)。
 类似资料:
  • 问题内容: 我无法找出使用杰克逊实现自定义序列化/反序列化的正确方法。我有很多类(〜50),它们带有应被序列化/反序列化而不是原始的原始字段。喜欢: 所有序列化和反序列化都非常相似,我只需要在整数之后添加一个后缀(C,页面,米等)。 一种简单的方法是在每个这样的字段中添加一对/ 注释并实现它们。但是我最终会得到100个 非常相似的 序列化器/反序列化器。 我想到了添加自定义注释的各个领域,说或,这

  • 可以序列化/反序列化< code >映射吗 在这种特殊情况下,我知道总是,和 - 第三方类(我有序列化器和反序列化器),其他值是盒装原语。 有可能和杰克逊做这样的事吗?使用MapSerializer/MapDeserializer可以做到这一点吗?(我找不到任何例子)

  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 我需要一个自定义反序列化器来在复杂的POJO中转换字符串。反序列化工作直到使用反序列化器:特别是使用自定义反序列化器时,我的对象的非对象属性不会序列化。 我有一个restful Web服务,它有一个pojo作为参数。 所以我的类PreentivoWs需要一个方法。这里是类定义: 在jsonObject中,我有一个枚举定义为 但此对象需要转换反序列化程序: 并在财产上标注: fromString方法

  • 我目前正在开发一个Java web应用程序,它使用Magento REST API公开的JSON数据。api返回的数据示例如下: 我的应用程序中有一个Java类,如下所示: 我想对数据进行反序列化,并将其转换为,但我总是得到以下错误: 这是我用来将JSON响应反序列化为ArrayList的语句行: 有人能分享一些见解吗?我看到一些例子,返回的JSON对象前面没有任何ID。那是因为我做错了什么吗?非

  • 主要内容: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技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台