替换JSON密钥中的空格

时间:2015-05-14 02:32:19

标签: java json parsing

我正在考虑用下划线替换JSON密钥中的所有空格的最佳解决方案。

{ 
  "Format": "JSON", 
  "TestData": { 
    "Key with Spaces in it": { 
      "And Again": { 
        "Child_Key1": "Financial", 
        "Child_Key2": null 
      }, 
......... 
..... 

我希望如上所示转换上述内容:

{ 
  "Format": "JSON", 
  "TestData": { 
    "Key_with_Spaces_in_it": { 
      "And_Again": { 
        "Child_Key1": "Financial", 
        "Child_Key2": null 
      }, 
......... 
..... 

有什么建议吗?

任何Java库是否都有预定义的功能来执行此操作?

6 个答案:

答案 0 :(得分:5)

更换密钥

以下代码使用Google的JSON解析器提取密钥,重新格式化它们,然后创建一个新的JSON对象:

public static void main(String[] args) {
    String testJSON = "{\"TestKey\": \"TEST\", \"Test spaces\": { \"child spaces 1\": \"child value 1\", \"child spaces 2\": \"child value 2\" } }";
    Map oldJSONObject = new Gson().fromJson(testJSON, Map.class);
    JsonObject newJSONObject = iterateJSON(oldJSONObject);

    Gson someGson = new Gson();
    String outputJson = someGson.toJson(newJSONObject);
    System.out.println(outputJson);
}

private static JsonObject iterateJSON(Map JSONData) {
    JsonObject newJSONObject = new JsonObject();
    Set jsonKeys = JSONData.keySet();
    Iterator<?> keys = jsonKeys.iterator();
    while(keys.hasNext()) {
        String currentKey = (String) keys.next();
        String newKey = currentKey.replaceAll(" ", "_");
        if (JSONData.get(currentKey) instanceof Map) {
            JsonObject currentValue = iterateJSON((Map) JSONData.get(currentKey));
            newJSONObject.add(currentKey, currentValue);
        } else {
            String currentValue = (String) JSONData.get(currentKey);
            newJSONObject.addProperty(newKey, currentValue);
        }
    }
    return newJSONObject;
}

您可以阅读有关GSON here的更多信息。

更换值

根据您的JSON数据的设置方式,您可能需要使用JSONObject切换JSONArray。

JSONArrays以[]开头和结尾,而JSONObjects以{}开头和结尾

简而言之,这些方法将遍历整个数组/对象,并用下划线替换任何空格。它们是递归的,因此它们将深入到子JSONArrays / JSONObjects。

如果JSON数据编码为Java JSONArray,则可以执行以下操作:

public static void removeJSONSpaces(JSONArray theJSON) {
    for (int i = 0; while i < theJSON.length(); i++) {
        if (theJSON.get(i) instanceof JSONArray) {
            currentJSONArray = theJSON.getJSONArray(i);
            removeJSONSpaces(currentJSONArray);
        } else {
            currentEntry = theJSON.getString(i);
            fixedEntry = currentEntry.replace(" ", "_");
            currentJSONArray.put(i, fixedEntry);
        }
    }
}

简而言之,此方法将遍历整个数组并用下划线替换任何空格。它是递归的,所以它将潜入子JSONArrays。

您可以阅读有关JSONArrays here

的更多信息

如果数据被编码为JSONObject,您需要执行以下操作:

public static void removeJSONSpaces(JSONObject theJSON) {

    jObject = new JSONObject(theJSON.trim());
    Iterator<?> keys = jObject.keys();

    while(keys.hasNext()) {
        String key = (String)keys.next();
        if (jObject.get(key) instanceof JSONObject) {
            removeJSONSpaces(jObject.get(key))
        } else {
            currentEntry = theJSON.getString(i);
            fixedEntry = currentEntry.replace(" ", "_");
            currentJSONArray.put(i, fixedEntry);
        }
    }

}

您可以阅读有关JSONObjects here

的更多信息

答案 1 :(得分:1)

您只需读入每个键/值,然后使用String replace(String oldString, String newString)方法。

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replace(char,%20char)

答案 2 :(得分:0)

我正在使用gson库来从json字符串中删除坏键,因为我想创建json的AVRO文件。 Avro不接受带空格或非字母数字的键,所以我必须首先清理输入。

上面的代码片段从所有键中删除了空格和字符$(迭代)。我假设我的json字符串是JsonObject。

查看我使用过的一小段示例代码。

for (String json: allJsons){
        JsonObject schema = new JsonParser().parse(json).getAsJsonObject();
        JsonObject cleanSchema = new JsonObject();
        Set<Map.Entry<String, JsonElement>> entries = schema.entrySet();
        for (Map.Entry<String, JsonElement> entry: entries) {
            String key = entry.getKey().replace("$","").replace(" ","");
            JsonElement value = entry.getValue();
            if (value.isJsonObject()){
                JsonObject subValue = new JsonObject();
                Set <Map.Entry<String, JsonElement>> subEntries = ((JsonObject) value).entrySet();
                for (Map.Entry<String, JsonElement> subEntry: subEntries) {
                    String subKey = subEntry.getKey().replace("$","").replace(" ","");
                    subValue.add(subKey, subEntry.getValue());
                }
                value = subValue;
            }
            cleanSchema.add(key, value);
        }

        System.out.println("Clean schema "+cleanSchema.toString());
        byte[] bytes = converter.convertToAvro(cleanSchema.toString().getBytes(), avroSchema);
        String avroFile = outputFileName+"_"+counter+".avsc";
        Files.write(Paths.get(avroFile), bytes);
        counter++;
        System.out.println("Avro File Created "+avroFile);
    }

答案 3 :(得分:0)

尝试这个:

      String testJSON = "{\"menu\": {\n" +
        "  \"id no\": \"file\",\n" +
        "  \"value type\": \"File\",\n" +
        "  \"popup value\": {\n" +
        "    \"menu item\": [\n" +
        "      {\"value\": \"New\", \"onclick\": \"CreateNewDoc()\"},\n" +
        "      {\"value\": \"Open\", \"onclick\": \"OpenDoc()\"},\n" +
        "      {\"value\": \"Close\", \"onclick\": \"CloseDoc()\"}\n" +
        "    ]\n" +
        "  }\n" +
        "}}";
             JSONObject json = new JSONObject(testJSON);
             System.out.println("Final output: "+replaceKeyWhiteSpace(json));

用“ _”替换空白

private static JSONObject replaceKeyWhiteSpace(Object json) {
JSONObject jsonObject = null;
if (json instanceof JSONObject) {
    jsonObject = (JSONObject) json;
    List<String> keyList = new LinkedList<String>(jsonObject.keySet());
    for (String key : keyList) {
        if (!key.matches(".*[\\s\t\n]+.*")) {
            Object value = jsonObject.get(key);
            replaceKeyWhiteSpace(value);
            continue;
        }

        Object value = jsonObject.remove(key);
        String newKey = key.replaceAll("[\\s\t\n]", "_");

        replaceKeyWhiteSpace(value);

        jsonObject.accumulate(newKey, value);

    }
} else if (json instanceof JSONArray) {
    for (Object aJsonArray : (JSONArray) json) {
        replaceKeyWhiteSpace(aJsonArray);
    }
}
return jsonObject;

}

答案 4 :(得分:0)

这是我从Json Keys删除空白的操作。解决方案将适用于JsonArray和JsonObject,只需使用空格打印匹配的正则表达式键,然后替换这些键即可。 现场演示:online Java compiler

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class MatcherGroupExample {

    public static void main(String[] args) {

        String text   = "{\"co nf ig\": {\"oauthSecret\": [{\"i d\": 45,\"config123\": {\"oauthSecret\": \"P8n2x5Ht0nFRRB0A\",\"status\": \"CREATED\"},\"SERVER132\": \"1000\"},{\"id\": 46,\"config123\": {\"oauthSecret\": \"wP8n2x5Ht0nFRRB0A\",\"status\": \"CREATED\"},\"SERVER132\": \"1000\"}],\"oauthKey\": \"newtest\",\"SERV ER\": \"1000\"},\"feat ures\": [ 9004, 9005] ,\"d\":\"dd\"}";


        String patternString1 = "\"([^\"]+?[ ]+[^\"]+?)\"\\s*:";

        Pattern pattern = Pattern.compile(patternString1);
        Matcher matcher = pattern.matcher(text);

        while(matcher.find()) {
            System.out.println("found: " + matcher.group(1));
           text= text.replaceAll("\""+matcher.group(1)+"\"","\""+(matcher.group(1).replaceAll(" ",""))+"\"");

        }
         System.out.println("Final output:"+text);
    }
}

答案 5 :(得分:-2)

在jason代码中仅删除字符串上的空格,而不是jason代码上的所有空格

public String removeWhiwspaceInJasonString(String jsonStr) {
    boolean changeActive = false;
    String output = '';
    for(int i=0; i<jsonStr; i++){

        if(jsonStr.charAt(i) == '"')
            changeActive  =!changeActive;
        else if(changeActive)
          if(jsonStr.charAt(i) == ' ')
             output += '_';
          else
             output += jsonStr.charAt(i);
        else
          output += jsonStr.charAt(i);

    }
    return output;
}