gpt4 book ai didi

java - 从解析的 JSON 中排除/删除字段

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:59 25 4
gpt4 key购买 nike

我正在调用一个传递 JSON 的 Web 服务并返回 JSON。我正在尝试记录请求和响应以进行故障排除。我想排除或划掉(通过 *)由字段名称正则表达式或其他内容标识的任何密码值。我使用 Gson 进行 JSON 解析和序列化。我在我的 logRequestlogResponse 方法中包含以下 toJson 方法调用:

private String toJson(String str) {
JsonElement elt = JSON_PARSER.parse(str);
return GSON.toJson(elt);
}

我没有看到任何对 JsonParser 对象有帮助的内容。我在通过 GsonBuilder 构造 Gson 实例时尝试了各种方法,但均无济于事。这种方法的困难似乎在于我没有映射到允许我使用 ExclusionStrategy 的 POJO。我当前的想法是递归地检查从 parse 方法返回的 JsonElement ,但我不确定这是否有效并且感觉很笨重,所以我想我会问。

最佳答案

由于通用 JSON 序列化的工作方式,以通用方式实现您的要求将会很困难。有人已经在这里问过类似的问题:Jackson: exclude object from serialization based on its properties 。如果您更愿意遵循此路径,那么在解析 JSON 字符串之后遍历 JSON 对象、识别密码字段并在序列化回记录器字符串之前显式清理这些值可能是一个不错的选择。

但是,如果您知道要记录的文档的 json 模式,问题就可以更容易解决。在这种情况下,您可以使用 jsonschema2pojo-maven-plugin 从模式生成 Java Pojo 对象,然后使用具有序列化排除策略的 Gson 库。这是一个例子:

    String jsonString = "{\"name\":\"parent\",\"id\":\"parentId\",\"password\":\"topsecret\"" +
",\"childPojo\":{\"name\":\"child\",\"id\":\"childId\",\"password\":\"topsecret\"}}";

RegexFieldExclusionStrategy strategy = new RegexFieldExclusionStrategy("pass.*");

Gson gson = new GsonBuilder()
.addSerializationExclusionStrategy(strategy)
.create();

MyPojo myPojo = gson.fromJson(jsonString, MyPojo.class);

String json = gson.toJson(myPojo);
System.out.println(json);

MyPojo 类:

public class MyPojo {

private String name;
private String id;
private String password;
private MyPojo childPojo;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public MyPojo getChildPojo() {
return childPojo;
}
public void setChildPojo(MyPojo childPojo) {
this.childPojo = childPojo;
}
}

请注意,此 Pojo 是手动实现,可以使用上面提到的插件替换为生成的实现,以简化整个过程。

RegexFieldExclusionStrategy 类:

import java.util.regex.Pattern;

import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;

public class RegexFieldExclusionStrategy implements ExclusionStrategy {

private String regex;

public RegexFieldExclusionStrategy(String regex) {
Pattern.compile(regex);
this.regex = regex;
}

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

public boolean shouldSkipField(FieldAttributes f) {
return f.getName().toLowerCase().matches(regex);
}
}

程序将输出以下 JSON 文档:

{"name":"parent","id":"parentId","childPojo":{"name":"child","id":"childId"}}

关于java - 从解析的 JSON 中排除/删除字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43592368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com