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"