将JSON原语映射到Java中的对象值

时间:2017-08-24 07:57:52

标签: java json jackson

我有以下JSON

{
  id: 1234,
  code: "N/A"
}

我想将其转换为此类的对象:

class MySweetObject {
  int id;
  SomeStringWrapper code;
}

class SomeStringWrapper {
  String code;

  Boolean isNotAvailable() {
    return "N/A".equals(code);
  }
}

简而言之 - 我想在对象中包装来自JSON的简单属性值以添加一些业务功能。空值不是一个选项,因为code是必需的属性。

有可能在杰克逊这样做吗?

3 个答案:

答案 0 :(得分:1)

您可以在setCode方法中使用JsonSetter注释:

来自文档:

  

Setter表示在遇到名称匹配的属性时   JSON内容,此方法将用于设置属性的值

通过这种方式,您可以在设置之前检查值是否为null,如果是null,则设置默认值(或执行任何操作)。

答案 1 :(得分:-1)

请尝试以下代码:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.javafx.fxml.PropertyNotFoundException;

class Main {

    public static void main(String[] args) throws Exception {
        String jsonString = "{\"id\":\"1234\"}";
        ObjectMapper mapper = new ObjectMapper();
        MySweetObject obj = mapper.readValue(jsonString, MySweetObject.class);
        System.out.println(mapper.writeValueAsString(obj));
    }
}

class MySweetObject {

    private String id;
    private String code;

    public String getId() {
        return id;
    }

    public String getCode() {
        if (code == null) {
            throw new PropertyNotFoundException("Property code cannot be null");
        } else {
            return code;
        }
    }
}

通常@JsonProperty(required = true)会抛出异常,但它不起作用,相反,如果属性为null或为空,则可以在getter中手动抛出异常。检查上面的代码,如果为null,它将抛出JsonMappingException

答案 2 :(得分:-1)

您需要修改您的JSON字符串,根据您的类修改它的错误。作为价值" N / A"杰克逊将假设是string,但这是SomeStringWrapper类的实例。

您的JSON应如下所示,以便反序列化到您的类结构:

{
  id: 1234,
  code: {
     code : "N/A"
  }
}