ObjectWriter的noAttribute方法不起作用

时间:2019-07-27 11:59:06

标签: java json jackson objectmapper

这是一个用于创建JSON的简单代码,但我希望它忽略此处的某些字段。所以我不想使用@JsonIgnore注释。但是问题是没有属性不起作用,所有字段都保留在JSON字符串中。 我还有另一个问题。我如何使用objectMapper格式化某些字段的值。例如,在更改为JSON且没有任何注释时,将username字段的值格式设置为** 8t。

TestObject testObject = new TestObject("858t","444hg", "mina");
ObjectWriter ow = new   ObjectMapper().writer().withDefaultPrettyPrinter().withoutAttribute("username").withoutAttribute("password");
String s = ow.writeValueAsString(testObject);
System.out.println(s);

我希望输出

{"name":"mina"} 

但我的成绩低于预期

{
"username" : "858t",
"password" : "444hg",
"name" : "mina"
}

这是我正在使用的Maven依赖项。我还尝试了其他版本,例如2.8.7

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.4</version>
 </dependency> 
<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.8</version>
</dependency>

更新:我使用了GSON库的ExclusionStrategy,并且可以正常工作。但是当我在服务器中使用它时,由于堆栈记录器中使用了下面的ExclusionStrategy,我的有线堆空间有了增长:

public class SecurityJsonExclusion implements ExclusionStrategy {

private Class<?> c;
ArrayList<String> fieldNames = new ArrayList<String>(Arrays.asList("username","password"));

public SecurityJsonExclusion(String... fieldNames) throws SecurityException {

    if (fieldNames != null) {
        Collections.addAll(this.fieldNames, fieldNames);
    }
}

public SecurityJsonExclusion() {

}
public boolean shouldSkipClass(Class<?> arg0) {
    return false;
}

public boolean shouldSkipField(FieldAttributes f) {

    if (fieldNames == null || fieldNames.size() == 0) {
        return false;
    } else {

        String name = f.getName();
        for (String s : fieldNames) {

            if (name.equalsIgnoreCase(s)) {
                return true;
            }
        }
        return false;

    }
}

}

像这样使用它:

  Gson gson = new GsonBuilder()
                .setExclusionStrategies(new SecurityJsonExclusion()).setPrettyPrinting()
                .create();
        return gson.toJson(o);

即使删除setExclusion部分,gsonBuilder本身也会消耗大量堆空间。

0 个答案:

没有答案