user_mda
user_mda

Reputation: 19388

toString() changes ":" to "=" in a java hashmap

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

Answers (1)

Jordi Castilla
Jordi Castilla

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

Related Questions