【问题标题】:Serializing and deserializing JSON targeting JAVA classes with Jackson使用 Jackson 序列化和反序列化针对 JAVA 类的 JSON
【发布时间】:2020-07-07 08:44:30
【问题描述】:

尝试将 JSON 反序列化/序列化为我创建的 Java bean。对杰克逊和这项努力来说真的很陌生,所以请多多包涵。我有以下内容:

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

我的 Java bean 被分解成几个,因为 JSON 中的对象被重复使用,所以它是:

@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; }
}

...和AnotherBlockBean 类以类似的方式实现(为简洁起见省略。)我为此使用Jackson,我的问题是-Jackson 中是否有一种机制可以针对这种情况进行序列化和反序列化?理想情况下,我想要一些类似的东西(下面的伪代码,因为我无法通过 Google 搜索或在此处搜索来显示任何内容):

// 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。我是梦想着想要这种内置功能还是它存在?

【问题讨论】:

    标签: java json serialization jackson deserialization


    【解决方案1】:

    使用 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 字段)。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多