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

Jackson ObjectMapper-当从远程响应反序列化后值为false时如何排除字段?

尉迟宣
2023-03-14
    public class MyResponse {

        private String stringValue;
        private int intValue;
        // Expectation: only include this field when value true, and exclude it when value is false
        private boolean booleanValue;
    }

    // @JsonIgnoreProperties(value = { "booleanValue" })
    // @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
    private static class MixInMyResponse {

    }

    // this would be my rest service eventually send myResponse to UI
    public MyResponse readFromRemote() throws IOException {
        String jsonAsString =
            "{\"stringValue\":\"a\",\"intValue\":1,\"booleanValue\":false}";
        ObjectMapper mapper = new ObjectMapper();
        // configure object mapper with mix in
        mapper.getDeserializationConfig().addMixInAnnotations(MyResponse.class, MixInMyResponse.class);
        MyResponse myResponse = mapper.readValue(jsonAsString, MyResponse.class);
        // Expectation: writeValue needs only include booleanValue when value true, and exclude booleanValue when value is false
        String writeValue = mapper.writeValueAsString(myResponse);
        System.out.println(writeValue);
        return myResponse;
    }

    null

共有1个答案

冯哲彦
2023-03-14

编写自己的序列化程序

public class MyResponseSerializer extends JsonSerializer<MyResponse> {
    @Override
    public void serialize(MyResponse myResponse, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("stringValue", myResponse.getStringValue());
        jsonGenerator.writeNumberField("intValue", myResponse.getIntValue());
        if (myResponse.isBooleanValue()) {
            jsonGenerator.writeBooleanField("booleanValue", myResponse.isBooleanValue());
        }
        jsonGenerator.writeEndObject();
    }
}

向ObjectMapper注册它

@Test
public void test3() throws IOException {
    MyResponse response1 = new MyResponse("response1", 1, true);
    MyResponse response2 = new MyResponse("response2", 1, false);

    ObjectMapper objectMapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addSerializer(MyResponse.class, new MyResponseSerializer());
    objectMapper.registerModule(module);
    System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response1));
    System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response2));
}

请参阅本教程

 类似资料:
  • 主要内容:使用excludeFieldsWithModifiers()方法,使用@Expose注解默认情况下,GSON排除序列化/反序列化过程中的瞬态和静态字段。 我们来看看下面的例子。 示例 创建一个名为的Java类文件:GsonTester.java - 执行上面示例代码,得到以下结果 - 使用excludeFieldsWithModifiers()方法 GsonBuilder使用序列化/反序列化过程中的方法提供对使用特定修饰符排除字段的控制。 看下面的例子。 示例 创建一个名为的Java

  • 我一直在尝试使用为锈迹中的,设置以下配置,因此我可以直观地在配置中为提供,但它将被反序列化为。不幸的是,当我希望它是一个数字()而不是一个字符串(时,它似乎失败了。 cargo.toml 以下会导致错误: 梅因 奇怪的是,将写成,成功并返回: 梅因 留档中给出的一个示例似乎与我的情况相关,但我还没有设法让它与我的设置一起工作。 将枚举序列化为编号 crate 提供了替代派生宏,这些宏派生相同的序列

  • 问题内容: 将xml文件序列化为.net c#对象后,在返回的json中获取k_BackingField。 我已经将DataContract和DataMember属性添加到.net c#对象,但是在json客户端上却什么也没得到。 返回的json的示例: 问题答案: 如果可以在序列化中使用该类,则实际上不建议使用自动属性语法。支持字段是由编译器生成的,每次编译代码时都会不同。即使未对类进行任何更改

  • 如果我们有如下查询 返回预期的结果(如下所示) 正如您所看到的,查询是针对和我们希望从结果中排除其他字段,但只包括和的字段 并排除其他字段,例如,以下是一些不是或(传递到查询中的字段)的字段-从

  • 问题内容: 我使用GSON进行序列化时,没有找到一种方法,无法根据Gson根据字段值提供的ExclusionStrategy类从序列化中排除某些字段,因为它仅支持基于顶级类或字段属性的排除。字段属性不包括该字段的值。所以我该怎么做? 问题答案: 实现此目的的方法是为相关类创建自定义序列化程序。在允许Gson以默认方式创建JSON对象之后,请根据其值删除要排除的属性。 并在用于此类的应用程序中用于序