jsonObject as string - 搜索正则表达式以删除密码字段

时间:2016-12-23 19:34:59

标签: java regex string

我有一个json String,它的内容中有一个像这样的字符串:

 "password": "password2"

这可以是json字符串中的任何位置,因此不要假设它在第一级。它甚至可以在jsonArray中。所以我需要搜索整个字符串并删除该字段,或将其值设置为null。

所以我需要能够搜索整个字符串并替换密码。例如,字符串可能如下所示:

我只是希望它用于记录。我的问题是,我想删除密码值,因为我正在与第三方共享。

我需要在java中使用正则表达式来搜索此字符串并用空字符串替换密码值,否则我甚至可以使用密码md5。如果没有密码字符串,它一定不会失败。我怎样才能做到这一点?所以要清楚,给定任何输入作为字符串我希望过滤后的结果为:

 "password": ""

或者它可以是密码值的md5而不是null,如果它更容易。你能帮忙吗?

所以我想创建的函数将如下所示:

public String removePasswordFromJsonString(String jsonString){


  //.. do the regualar expression work here....

  return jsonString;

}

3 个答案:

答案 0 :(得分:4)

试试这个,

String response="{ \"password\": \"password2\", \"otherValue\": \"c18bd5a4-f734-44bf-be77-56b1267dcb9e\" }";
try {
    JSONObject jsonObject=new JSONObject(response);
    jsonObject.put("password", "");
    System.out.println(jsonObject.toString());
} catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

输出:

{"password":"","otherValue":"c18bd5a4-f734-44bf-be77-56b1267dcb9e"}

注意:上面的代码会将您的密码字段设置为空,无论它在哪里,顺序都没关系,它只会用空字符串覆盖该字段

如果您仍想使用regex,请应用此

Regex Demo

    String response="{\n \"email_address\": \"user_JeAw@domain.com\",\n \"password\": \"password1\",\n \"device_id\": \"wtnmrrwyhjeatdcnt\",\n \"device_name\": \"xshjavwuqmtnkhuuxkjfgsnfnd\",\n \"device_token\": \"03118557-2755-495b-f97e\"\n}";
    try {

        String newstr= response.replaceAll("(?:\\bpassword)\\W+\\w+", "password\":\"");
        JSONObject jsonObject=new JSONObject(newstr);
        if (jsonObject.getString("password").isEmpty()) {
            System.out.println("empty password" + jsonObject.getString("password"));
        }           
    } catch (JSONException e) {     }

输出:

empty password

(?:\\bpassword)\\W+\\w+

(?:\\bpassword)匹配password字符串

  • ?:匹配令牌
  • \\b边界意味着不匹配another_password
  • 之类的内容

\\W+匹配任何非单词字符均表示,\n

等特殊字符

\w+捕获一个或多个单词,以捕获\":"之后的字符串

答案 1 :(得分:2)

在将对象转换为JSON字符串时,暂时从对象中删除密码。

我不知道确切的Java代码,但这里是伪代码:

tempPass = jsonObject.password;
jsonObject.password = "";
jsonString = jsonObject.toString();
jsonObject.password = tempPass;

如果您知道密码永远不会包含双引号(一般来说是危险的假设),您可以使用正则表达式"password":\s*".*?"并将其替换为"password": ""

String regex = "\"password\":\\s*\".*?\"";

答案 2 :(得分:1)

试试这个:

:

这应该能够用空字符串替换所有出现的密码值,无论它的嵌套程度如何。

编辑:这将在冒号(*)的每一侧处理零个或一个空格。要处理任意数量的空格,请使用星号(?)而不是问号("(\\n?\\s*\"password\"\\s*:\\s*\")[^\\n\"]*(\",?\\n?)"):

9999.81GB increase - "c:\$RECYCLE.BIN" 1.91GB total 11.54GB increase - "c:\Program Files (x86)" 11.55GB total 101.57GB increase - "c:\Windows" 101.61GB total