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

Java到JSON:指定每次转换排除哪些字段

屈宏爽
2023-03-14

如前所述,我知道我可以将Java对象转换为JSON(使用Jackson)

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(objectToBeConverted);

我知道我可以使用@JsonIgnore注释排除JSON字符串中包含的字段,但是如果我想多次将相同的类转换为JSON,但每次都选择要忽略的不同字段,该怎么办?

例如,如果我有一堂课

class Foo {
    int a;
    int b;
    ...
}

我能做点像这样的事吗

Foo foo = new Foo();
String json1 = ow.writeValueAsString(foo).excludeField('b');
String json2 = ow.writeValueAsString(foo).excludeField('a');

这样产生的字符串看起来就像

// json1
{
    a: 1234
}
// json2
{
    b: 5678
}

如果杰克逊做不到,也许格森可以?或者另一个图书馆?

共有3个答案

郭翰墨
2023-03-14

如果你能把所有的Foo原语类型都框起来,这里有一个简单的方法。

例如:int-

@JsonInclude(Include.NON_NULL)
class Foo {
    Integer a;
    Integer b;
    ...
}

然后,只需复制一份Foo,并将要忽略的属性设置为null

java prettyprint-override">Foo foo = new Foo();
foo.setA(1234);
foo.setB(5678);

Foo foo1 = objectMapper.readValue(objectMapper.writeValueAsString(foo), Foo.class);  // make a copy of Foo
foo1.setB(null);  // force to ignore B
String json1 = ow.writeValueAsString(foo1); // it will be {a:1234}

袁翰池
2023-03-14

您可以尝试使用不同的混合接口。我找到了两种方法。

>

  • 使用读取属性的方法。然后,可以创建一个只定义要排除的属性的混合类:

    public interface ExludeA {
        @JsonIgnore
        int getA();
    }
    

    使用@JsonIncludeProperties不告诉要排除哪些属性,而是告诉要包括哪些属性:

    @JsonIncludeProperties({ "b", "c" })
    public interface ExludeA {
    }
    

    在这两种情况下,将该混合添加到对象映射器中:

    objectMapper.addMixIn(Foo.class, ExcludeA.class);
    

    但是有一件非常非常重要的事情——你必须为每一次混入使用一个新的ObjectMapper。如果使用ObjectMapper实例来序列化Foo实例,而不使用mix-in,那么添加mix-in将没有帮助。这可能是因为ObjectMapper实例缓存了一些东西。

  • 葛霄
    2023-03-14

    根据您的需要有多种解决方案:

    首先:
    您可以为您的目的定义两个不同的DTO,每次您需要每个DTO时,只需使用它。

    第二:
    可以使用@JsonInclude(JsonInclude.Include.NON_NULL)注释属性:

    class Foo {
    
        @JsonInclude(JsonInclude.Include.NON_NULL)
        int a;
    
        @JsonInclude(JsonInclude.Include.NON_NULL)
        int b;
    }
    

    附言:你可以在课堂上使用这个注释:

    @JsonInclude(JsonInclude.Include.NON_NULL) 
    class Foo {
        int a;
        int b;
    }
    

    第三:
    Use可以定义一个过滤器,根据不同的条件忽略属性。

    为筛选器定义一个简单的类:

    public class YourConditionalFilter {
    
        @Override
        public boolean equals(int a) {
            return a == 1234;
        }
    }
    

    然后在属性顶部添加此过滤器作为注释:

    @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = YourConditionalFilter.class)
    int a;
    
     类似资料:
    • 如前所述,我知道我可以将Java对象转换为json(使用Jackson) 我知道我可以使用注释将字段排除在json字符串中,但是如果我想多次将同一个类转换为json,但每次都选择忽略不同的字段,该怎么办? 例如,如果我有一门课 我能做一些像 这样产生的字符串看起来就像 如果杰克逊做不到,也许格森可以?还是另一个图书馆? 任何帮助都将不胜感激!

    • 问题内容: 我正在从String变量的Restful api获取数据,现在我想转换为JSON对象,但是在转换时会引发异常,这是我的问题。这是我的代码: 我的字符串包含 这是我想要在json中使用的字符串,但它向我显示了线程“ main”中的异常 问题答案: 的是本内的。您需要按层次分析JSON,以便能够正确获取数据。 注意:本示例使用类而不是。 正如“ Matthew”在他正在使用的注释中提到的那

    • 我有一个json 我怎么把它转换成学生名单(A,理科)(B,理科)

    • 问题内容: 我有一个场景。 必需的输入和输出是JSON。 我需要一些转换代码或最好是xslt类型的语言才能将json从一种格式转换为另一种格式。该变压器也需要快速运行,因为转换将即时进行。 编辑 我没有收到INPUT对象的定义,它可能会在运行时更改。但是如果需要,我可以将类用于OUTPUT对象。我尝试以 json- > xml-> xslt-> xml-> json的方式进行此操作 ,但 此刻 每

    • 我想转换我的嵌套json消息,并使用Jolt规范只获取必需的文件- 我的输入JSON: 低于我的规格输出,这不是预期的- 我尝试了很多选择,但国籍不是我预期的输出。请在这里帮助颠簸转换

    • 我一直在测试char casting,我经历了以下几点: 有人能解释为什么我在1中给字节添加了一个final时它工作得很好吗?