java - JSON 中所选键的掩码值

标签 java json gson

我有 JSON 请求和响应,我想在日志中打印 JSON,但是有一些我想避免在日志中打印的安全字段,我试图屏蔽字段键: 示例:

屏蔽前:

  {"username":"user1","password":"123456","country":"US","creditCardNumber":"1283-1238-0458-3458"}

屏蔽后

{"username":"user1","password":"XXXXXX","country":"US","creditCardNumber":"XXXXXX"}

我正在使用 java Gson 库,请帮我做一下

编辑

我想动态传递 key ,所以在函数 a 中我想屏蔽这些字段,但在函数 b 中不同的字段。

最佳答案

我认为您应该从日志中排除该字段。下面是一个使用 Gson@Expose 注释的简单示例。

public static void main(String[] args) throws IOException {
    String json = "{\"username\":\"user1\",\"password\":\"123456\",\"country\":\"US\",\"creditCardNumber\":\"1283-1238-0458-3458\"}";

    Gson gson = new Gson();
    User user = gson.fromJson(json, User.class);

    System.out.println(gson.toJson(user));

    Gson gsonExpose = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
    System.out.println(gsonExpose.toJson(user));
}

public class User {
    @Expose
    private String username;
    private String password;
    @Expose
    private String country;
    private String creditCardNumber;
}

输出将是:

{"username":"user1","password":"123456","country":"US","creditCardNumber":"1283-1238-0458-3458"}
{"username":"user1","country":"US"}

另一种使用反射的解决方案:

public static void main(String[] args) throws IOException {
    String json = "{\"username\":\"user1\",\"password\":\"123456\",\"country\":\"US\",\"creditCardNumber\":\"1283-1238-0458-3458\"}";

    Gson gson = new Gson();
    User user = gson.fromJson(json, User.class);

    List<String> fieldNames = Arrays.asList("password", "creditCardNumber");
    System.out.println(mask(user, fieldNames, "XXXXXXX"));
}

public static String mask(Object object, List<String> fieldNames, String mask) {
    Field[] fields = object.getClass().getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
        if (fieldNames.contains(fields[i].getName())) {
            try {
                fields[i].setAccessible(true);
                if (fields[i].get(object) != null) {
                    fields[i].set(object, mask);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    Gson gson = new Gson();

    return gson.toJson(object);
}

关于java - JSON 中所选键的掩码值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31241654/

相关文章:

java - 在ExtGWT中上传并读取excel文件

python - 对 Python 将 JSON 作为字符串而不是文字返回感到困惑

java - Gson 将一组数据对象转换为 json - Android

json - Scala:将案例类序列化为 JSON ,备用名称

java - 安卓。 JSON 解析器在我的新模块中返回 null

java - 我应该使用哪个 API 在我的网站上实现搜索

java - 语音转文本,java语音API,哪里可以找到?

java - 如何在 Spring 表达式语言 SpEL 中对域对象集合进行身份验证

json - 如何使用 Decodable 协议(protocol)将此 JSON 转换为 Swift 结构?

javascript - 如何将 json 字符串中的某些文本设为粗体?