Reputation: 19388
I have the following
public static void main(String []args) throws JSONException{
Map<String,String> varMap = new HashMap<String,String>();
varMap.put("VAR","123");
varMap.put("OTHER_VAR","234");
JSONObject json = new JSONObject();
json.put("Variable",varMap);
System.out.println("JSON " + json);
}
This gives me the correct result as follows
JSON {"Variable":{"VAR":"123","OTHER_VAR":"234"}}
But in my json I can only use a String value, so changing it to following gives me an unexpected result
public static void main(String []args) throws JSONException{
Map<String,String> varMap = new HashMap<String,String>();
varMap.put("VAR","123");
varMap.put("OTHER_VAR","234");
JSONObject json = new JSONObject();
json.put("Variable",varMap.toString());
System.out.println("JSON " + json);
}
Unexpected Result
JSON {"Variable":"{VAR=123, OTHER_VAR=234}"}
I can achive this by manually replacing the equal to with ":"
public class json{
public static void main(String []args) throws JSONException{
Map<String,String> varMap = new HashMap<String,String>();
varMap.put("VAR","123");
varMap.put("OTHER_VAR","234");
JSONObject json = new JSONObject();
String jsonVarMap = varMap.toString().replace("=", ":");
json.put("Variable", jsonVarMap);
System.out.println("JSON " + json);
}
}
But is there a better way? How do I change the map to an exact String?
Upvotes: 2
Views: 3360
Reputation: 26961
This is because you use HashMap::toString()
:
json.put("Variable",varMap.toString());
And this is the usual behaviour.
Replace is not bad in simple cases, but if some of your data contents a =
it will break your json.
If you want to get correct result in a more polite mode, extend
HashMap
and override toString
:
JSonMap.java
public class JSonMap<K,V> extends HashMap<K,V> {
private static final long serialVersionUID = 1L;
private static String SEPARATOR = "";
private static final char QUOTE = '"';
private static final char DOTS = ':';
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Map.Entry<K, V> entry : this.entrySet()) {
sb.append(SEPARATOR);
// same as sb.append("" + QUOTE + entry.getKey() + QUOTE + ":" + QUOTE + entry.getValue() + QUOTE);
sb.append(QUOTE);
sb.append(entry.getKey());
sb.append(QUOTE);
sb.append(DOTS);
sb.append(QUOTE);
sb.append(entry.getValue());
sb.append(QUOTE);
SEPARATOR = ", ";
}
return sb.toString();
}
}
Execute it:
Map<String,String> varMap = new JSonMap<String,String>();
varMap.put("VAR","123");
varMap.put("OTHER_VAR","234");
System.out.println(varMap);
OUTPUT:
"VAR":"123", "OTHER_VAR":"234"
Now, apply to your JSON to get expected result ;)
Upvotes: 3