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

禁用每个ObjectMapper的字段序列化

郑茂材
2023-03-14
public class MyClass {

  @JsonProperty(access = WRITE_ONLY)
  private String field;

  ...

}

我想知道,是否有某种方法来指示对象映射器(或注入一些东西到它)以不同的方式处理这样的字段?

共有1个答案

华瀚漠
2023-03-14

当您在客户端和服务器端使用通用模型类时,您可以使用com.fasterxml.jackson.databind.module类及其实现注册所有差异。如果某些jackson配置只能在一侧可用,您可以将其移动到MixIn类/接口,并仅在给定的一侧注册。

简单示例:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.IOException;

public class ClientServerApp {

    public static void main(String[] args) throws IOException {
        // Client side
        ObjectMapper clientMapper = JsonMapper.builder().build();

        // create payload on client side
        MyClass instance = new MyClass(1, "fieldValue");
        String payload = clientMapper.writeValueAsString(instance);

        // send to server
        System.out.println("Send: " + payload);
        // ..

        // Server side
        ObjectMapper serverMapper = JsonMapper.builder()
                .addModule(new ServerModule())
                .build();
        MyClass deserialized = serverMapper.readValue(payload, MyClass.class);
        System.out.println("Deserialized: " + deserialized);

        System.out.println("Payload on server side: " + serverMapper.writeValueAsString(deserialized));
    }
}

class ServerModule extends SimpleModule {
    public ServerModule() {
        setMixInAnnotation(MyClass.class, MyClassServerMixIn.class);
        // add other configuration
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class MyClass {

    private int id;
    private String field;
}

interface MyClassServerMixIn {

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    String getField();
}

上面的代码打印:

Send: {"id":1,"field":"fieldValue"}
Deserialized: MyClass(id=1, field=fieldValue)
Payload on server side: {"id":1}
 类似资料:
  • 假设我有这样的json,我想将其反序列化为一个名为SubscriberProfile的对象。 当我使用以下代码时,它可以正常工作, 但如果json中缺少字段2,我希望objectmapper抛出和异常(可能缺少字段1和字段2)。 所以这样的json应该抛出一个异常 我曾尝试使用注释,但仅在序列化它时有效。 你知道我该怎么解决这个问题吗? 提前感谢

  • 问题内容: 的功能需要Class。但是,如果我内部传递的类将某些接口作为数据成员,该如何使用它。 尽管我可以理解此异常的原因,因为杰克逊没有获得所传递类的内部接口的具体类,但我的问题是如何解决它?那我该如何反序列化呢?我要反序列化的类是: 这是一个接口,所以这给了我以下错误:- 问题答案: 杰克逊显然不能构造对象,因为它是一个接口。您将需要在json和ObjectMapper中具有其他信息,以告诉

  • 我想使用对象映射器序列化不同类型的列表,但我不知道如何一次将不同类型的列表对象传递到对象映射器中。以下是我的代码: 你能建议我应该通过什么吗?在上面的代码中。这是因为我必须将jackson序列化的字符串作为jsp中的一个字符串包括上面的列表,并解析该字符串以获得在客户端使用的单个列表。

  • 问题内容: 我知道如何序列化整个表格,如下面的示例或表格的一个特定字段,只需更改以下行即可: 至 。 但是我想序列化具有ID的2个输入字段....该怎么做? 问题答案: 方法1: 通过逗号分隔的选择器,可以使用以下代码将两个字段序列化 方式2: 使用jQuery serialize()函数时,它只是将您的字段转换为a = 1格式的字符串。因此,您当然可以将此函数应用于两个字段,并将结果连接起来,并

  • 我正在努力用本地化反序列化世界天气在线API结果。 是否有更好、更简单的解决方案,只为lang对象编写一个自定义反序列化器,并允许GSON自动反序列化其余数据?

  • 如何告诉 Jackson ObjectMapper 从序列化中忽略特定类型(类)的字段的情况下)? 约束条件: 不控制源类-它是第三方类。 被序列化的类类型是未知的-我猜它取消了MixIn的资格。 此类字段的名称预先未知 为了提供帮助,下面是一个单元测试,期望从序列化中忽略字段和,但它的方法是不正确的,它是按名称而不是按类型过滤它们。