我正在尝试删除某些键的空值,我尝试使用此REGEX,但是它不起作用。请您的建议...
private static final String REMOVE_NULL_VALS_REGEX = ",\"([^\"]+)\":null|\"([^\"]+)\":null,|\"([^\"]+)\":null";
{
"event": "111e0d4a",
"type": "business",
"eventProducerId": "Billing",
"eventVersion": "1.0",
"headerReference": {
"activityId": "999",
},
"payload": {
"trans": "Line",
"details": {
"plan": {
"features": [
{
"featureName": "GSM",
}
],
"planName": "null"
},
"number": {
"mobileNumber": "111111111"
},
"lineType": "GSM"
},
"dea": "0000002",
"sourceBan": "null",
"financialAccount": {
"financialAccountNumber": "212121"
},
"reasonCode": "null"
}
}
我进行了转换为字符串的操作,并且尝试使用正则表达式删除这些空值。
答案 0 :(得分:0)
我建议您使用GSON,是非常容易的库
您可以在此页面上创建pojo:http://www.jsonschema2pojo.org/
您可以创建一个pojo(java类)
如果某个值为null,则该类的值为null。
如果要查看教程,可以查看以下链接:https://www.mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/
答案 1 :(得分:0)
因此,正如Carlos Heuberger所指出的那样,您在引号中寻找一个冒号,但没有匹配任何内容。这里(在引号之间)是一个正则表达式,适合在您的上下文中用“”代替replaceAll。
"\"[^\"]*\"[^\"]*\"null\""
逻辑是这样的。您要寻找一个引号,然后是引号之外的其他内容,然后是另一个引号,除了(通常是冒号和空格)之外还有其他内容,然后是“ null”。您用空字符串替换。唯一的缺点是,您可能会留下不需要的逗号。假设您的字符串中都没有逗号,则通过多几行代码即可清理它们(碰巧,例如问题中的示例,它还清理了其他两个可疑的json)。
因此,以下内容将通过RegEx实现您的目标(这里的其他评论和答案可能是正确的,因为这不是最佳途径,我只是赞同您的想法)。
// examples from question or later comment, your choice
//public static String jStr = "{\r\n \"event\": \"111e0d4a\",\r\n \"type\": \"business\",\r\n \"eventProducerId\": \"Billing\",\r\n \"eventVersion\": \"1.0\",\r\n \"headerReference\": {\r\n \"activityId\": \"999\",\r\n },\r\n \"payload\": {\r\n \"trans\": \"Line\",\r\n \"details\": {\r\n \"plan\": {\r\n \"features\": [\r\n {\r\n \"featureName\": \"GSM\",\r\n }\r\n ],\r\n \"planName\": \"null\"\r\n },\r\n \"number\": {\r\n \"mobileNumber\": \"111111111\"\r\n },\r\n \"lineType\": \"GSM\"\r\n },\r\n \"dea\": \"0000002\",\r\n \"sourceBan\": \"null\",\r\n \"financialAccount\": {\r\n \"financialAccountNumber\": \"212121\"\r\n },\r\n \"reasonCode\": \"null\"\r\n }\r\n}";
public static String jStr = "{\"transactionType\":\"UCCLineAct\",\"dealerCode\":\"0000002\",\"financialAccount\":{\"financialAccountNumber\":\"110885364\"},\"lineOfServiceDetails\":{\"lineType\":\"GSM\",\"number\":{\"mobileNumber\":\"4079232335\"},\"ratePlan\":{\"planName\":\"null\",\"features\":[{\"featureId\":\"UCCGSM\",\"featureName\":\"UCC GSM\"}]}},\"reasonCode\":\"null\",\"sourceBan\":\"null\"} ";
public static void main(String args[]) {
System.out.println(jStr); // show before we mess with it
jStr=jStr.replaceAll("\"[^\"]*\"[^\"]*\"null\"",""); //replace "blah" :"null"
jStr=jStr.replaceAll("(,[ \t\r\n\f]*,)+",","); //cut repeated commas separated by at most whitespace, to a single comma
jStr=jStr.replaceAll("\\{[ \t\r\n\f]*,","\\{"); // remove comma appearing immediately (possibly with whitespace between) after {
jStr=jStr.replaceAll("\\[[ \t\r\n\f]*,","\\["); // remove comma appearing immediately after [
jStr=jStr.replaceAll(",[ \t\r\n\f]*\\}","\\}"); // remove comma immediately before }
jStr=jStr.replaceAll(",[ \t\r\n\f]*\\]","\\]"); // remove comma immediately before ]
System.out.println(jStr); // show after
}
在正则表达式中可能包含一些逗号可能有些巧妙的方法,但是对于我来说,涵盖所有情况变得太难了。同样,从理论上讲,[\ t \ r \ n \ f]应该可以用[\ s]代替,但是jdoodle对此表示反对。