我有一个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;
}
答案 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
,请应用此
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