2016-08-08 46 views
2

Ich habe folgendtoString() Änderungen ":" zu "=" in einem Java hashmap

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

    } 

Das gibt mir das richtige Ergebnis als

JSON {"Variable":{"VAR":"123","OTHER_VAR":"234"}} 

Aber in meinem json folgt kann ich verwenden nur einen String-Wert, so dass es an sich verändernde folgende gibt mir ein unerwartetes Ergebnis

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

     } 

unerwartetes Ergebnis

JSON {"Variable":"{VAR=123, OTHER_VAR=234}"} 

Ich kann das achive durch manuell gleich mit dem Ersetzen „:“

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

    } 
} 

Aber gibt es einen besseren Weg? Wie ändere ich die Karte in einen exakten String?

+1

'json.put ("Variable", neue JSONObject (varMap) .toString());'? – Ryan

+6

Verlassen Sie sich niemals auf das Verhalten der toString-Methode ... Es gibt geeignete Methoden zum Serialisieren nach JSON ... – ppeterka

+0

Gibt diesen JSON zurück {"Variable": "{\ VAR \": \ "123 \", \ "OTHER_VAR \": \ "234 \"} "} –

Antwort

2

Dies liegt daran, Sie HashMap::toString() verwenden:

json.put("Variable",varMap.toString()); 

Und das ist das übliche Verhalten.


Ersetzen ist in einfachen Fällen nicht schlecht, aber wenn einige Ihrer Dateninhalte ein = wird es Ihre json brechen.

Wenn Sie korrektes Ergebnis in einem höflichen Modus extendHashMap und außer Kraft setzt toString zu erhalten:

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

} 

es Execute:

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" 

Nun, um Ihre JSON gelten erwartet ;) Ergebnis zu erhalten

+2

Ich werde nur auf diese Antwort hinzufügen, dass, wenn Sie 'Java 8' verwenden der [StringJoiner] (https: // docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html) könnte eine glatte Alternative zur Lösung "Append Seperator" aus dieser Antwort sein. Ansonsten ist diese Antwort ziemlich komplett :). – SomeJavaGuy

+1

@Jordi, danke, ich war auf der Suche nach etwas so organisiert wie dieses! –

+0

@Kevin, ich bin auf Java 7, aber thansk für die Info! –