Java 8,杰克逊,REST API:已设置,为空或根本不存在的值

时间:2018-12-07 11:41:35

标签: java json jackson

我必须调用REST API(方法PATCH)。在该补丁调用的请求正文中,有两个值“ foo”和“ bar”。 foo和bar指的是Foo和Bar类型的对象(在Java中都是类)。

对于foo,有两种可能性:

  • 如果请求主体中不存在foo,则在服务器上foo的值不会更改。
  • 如果存在foo,则会更新服务器上foo的值。

但是对于酒吧来说,存在三种可能性:

  • 如果请求正文中不存在bar,则在服务器上不更改bar的值。
  • 如果存在bar,则服务器将bar的值设置为新值(或创建新的bar)。
  • 如果bar为null,则服务器将其内部状态设置为“没有bar”。

JSON示例

{
    "foo": {}
}

{
    "foo": {},
    "bar": {}
}

{
    "foo": {},
    "bar": null
}

{
    "bar": {}
}

{
    "bar": {}
}

我正在寻找一种使用Jackson来在Java 8中表达这一点的方法。但是我只能实现在JSON 中省略了一个值,或者它为null。

实体类应类似于此:

public class Entity {

    private Foo foo;
    private Bar bar;

    public Foo getFoo() {
        return foo;
    }

    public void setFoo(Foo foo) {
        this.foo = foo;
    }

    public Bar getBar() {
        return bar;
    }

    public void setBar(Bar bar) {
        this.bar = bar;
    }

}

完成映射的其他地方:

ObjectMapper objectMapper = new ObjectMapper();

try {
    Entity e = new Entity();

    e.setFoo(new Foo());
    System.out.println(objectMapper.writeValueAsString(e));

    e.setBar(new Bar());
    System.out.println(objectMapper.writeValueAsString(e));
} catch (JsonProcessingException e1) {
    e1.printStackTrace();
}

输出看起来像这样

{"foo":{},"bar":null}
{"foo":{},"bar":{}}

如果我添加

@JsonInclude(JsonInclude.Include.NON_ABSENT)

将Entity更改为输出

{"foo":{}}
{"foo":{},"bar":{}}

我是否使用NULL或Optionals都没有关系。只有两种状态。是否设置值。 “未设置”可以 通过Jackson通过JSON表示为null或省略值。我所缺少的是执行任何一种操作的方式:在一种情况下,将其忽略(不存在),而在另一种情况下将其设置为null(有,但没有值)。 如何使用Jackson来用Java表达这一点?有可能还是我不走运?

类似

public class Entity {

    private Foo foo;
    private Magic<Bar> bar;

...

或通过一些时髦的注释连接的其他布尔

或...!?

0 个答案:

没有答案