带正则表达式的Java JSON字符串格式

时间:2018-08-20 15:30:16

标签: java json regex

对于给定的纯JSON数据,请执行以下格式设置:

  1. 用下划线替换中的所有特殊字符
  2. 删除双引号
  3. 用=
  4. 替换:

示例:

JSON数据:{“ no / me”:“ 139.82”,“ gc.pp”:“ \ u0000 \ u000”,...}

格式化后:no_me =“ 139.82”,gc_pp =“ \ u0000 \ u000”

使用正则表达式可以吗?或任何其他单个命令执行?

2 个答案:

答案 0 :(得分:0)

使用单个正则表达式进行全部更改可能会过大。我认为您可以编写与此类似的代码

(注意:由于我不是用Java编写代码,所以我的示例是使用javascript,只是为了让您了解它)

var json_data = '{"no/me": "139.82", "gc.pp": "0000000", "foo":"bar"}';
console.log(json_data);
var data = JSON.parse(json_data);
var out = '';
for (var x in data) {
  var clean_x = x.replace(/[^a-zA-Z0-9]/g, "_");
  if (out != '') out += ', ';
  out += clean_x + '="' + data[x] + '"';
}
console.log(out);

基本上,您可以遍历所有键并对其进行清理(删除不需要的字符),并使用新键和原始值创建具有所需格式的新字符串。

重要:请记住重叠的ID。例如,no/meno#me都将重叠到相同的ID no_me中。这可能并不重要,因为您毕竟不会输出JSON。我告诉你以防万一。

答案 1 :(得分:0)

我已经很长时间没有Java了,但是我认为您需要类似的东西。 我假设您在这里specialchars的意思是“所有非单词字符”。

import java.util.regex.*;

String JsonData = '{"no/me": "139.82", "gc.pp": "\u0000\u000", ...}';

// remove { and }
JsonData = JsonData.substring(0, JsonData.length() - 1);
try {
    Pattern regex = Pattern.compile("(\"[^\"]+\")\\s*:");                 // find the keys, including quotes and colon
    Matcher regexMatcher = regex.matcher(JsonData);
    while (regexMatcher.find()) {
        String temp = regexMatcher.group(1);                              // "no/me": 
        String key = regexMatcher.group(2).replaceAll("\\W", "_") + "=";  // no_me=
        JsonData.replaceAll(temp, key);
    } 
} catch (PatternSyntaxException ex) {
    // regex has syntax error
}

System.out.println(JsonData);