我正在考虑用下划线替换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库是否都有预定义的功能来执行此操作?
答案 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的更多信息。
更换值 strong>
根据您的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;
}