通过正则表达式删除空键

时间:2019-07-28 20:06:25

标签: java json regex regex-group

我正在尝试删除某些键的空值,我尝试使用此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"
  }
}

我进行了转换为字符串的操作,并且尝试使用正则表达式删除这些空值。

2 个答案:

答案 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对此表示反对。