toString()更改";:&引用;至=&引用;在java hashmap中

toString()更改";:&引用;至=&引用;在java hashmap中,java,string,hashmap,tostring,Java,String,Hashmap,Tostring,我有以下几点 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 = ne

我有以下几点

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);

    }
但在我的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();
            json.put("Variable",varMap.toString()); 
            System.out.println("JSON " + json);

        }
我可以通过手动将等于替换为“:”来实现此目的

公共类json{
公共静态void main(字符串[]args)抛出JSONException{
Map varMap=newhashmap();
varMap.put(“VAR”、“123”);
varMap.put(“其他变量”,“234”);
JSONObject json=新的JSONObject();
字符串jsonVarMap=varMap.toString().replace(“=”,“:”);
put(“变量”,jsonVarMap);
System.out.println(“JSON”+JSON);
}
}
但是有更好的办法吗?
如何将映射更改为精确的字符串?

这是因为您使用了
HashMap::toString()

这是通常的行为


在简单的情况下,Replace并不坏,但是如果您的一些数据内容是
=
,它将破坏您的json

如果您想以更礼貌的方式获得正确的结果,请扩展HashMap并覆盖toString:

json.put("Variable",varMap.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();
    }

}

现在,应用到JSON以获得预期的结果(
;)

json.put(“变量”,新的JSONObject(varMap.toString())?永远不要依赖toString方法的行为。。。有合适的序列化JSON的方法…返回这个JSON{“变量”:“{\'VAR\':\'123\',\'OTHER\'u VAR\':\'234\'}”。也可以从
AbstractMap\toString
的文档中尝试:
每个键值映射都呈现为键,后跟一个等号(=”),后跟相关值。
。由于您只需调用
Map.toString
,将提供上述结果。我只想补充一下这个答案,如果您使用
Java8
的话,它可能是这个答案中“append separator”解决方案的平滑替代方案。否则,这个答案相当完整:)@Jordi,谢谢你,我正在寻找这样有条理的东西@凯文,我在用Java 7,但我想知道更多信息!虽然我需要输出中的引号,但它们似乎gone@user_mda我的错误,请检查更新的tostring方法跳过引号
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);

    }
}
json.put("Variable",varMap.toString()); 
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();
    }

}
Map<String,String> varMap = new JSonMap<String,String>();
varMap.put("VAR","123");
varMap.put("OTHER_VAR","234");

System.out.println(varMap);
"VAR":"123", "OTHER_VAR":"234"