2016-07-09 8 views
0

Ich möchte ein JSON-Array-Objekt mit Liste und hashmap schaffen, aber ich habe einige seltsame Problem während der Programmausführung konfrontiert.Ausgangsfehler während Java Erstellen Json-Array-Objekt mit Liste und HashMap

Dies ist mein Code:

List<HashMap> list = new ArrayList<>(); 
HashMap<String, String> hmap = new HashMap<>(); 
String raw = "<CONTENT><DETAIL><USER>user1</USER><MAIL>[email protected]</MAIL></DETAIL><DETAIL><USER>user2</USER><MAIL>[email protected]</MAIL></DETAIL></CONTENT>"; 
String partRas = ""; 
int index = raw.indexof("<USER>"); 

while(index >= 0) { 
    if(index + 50 < raw.length()) 
     partRaw = raw.subString(index, index + 50); 

    hmap("user", getTagValue(partRaw, "USER")); 
    hmap("email", getTagValue(partRaw, "MAIL")); 
    list.add(hmap); 

    raw = raw.subString(index + 50, raw.length()); 
    index = raw.indexof("<USER>"); 
} 

System.out.println(new Gson().toJson(list)); 


public static String getTagValue(String xml, String tagName){ 
    return xml.split("<"+tagName+">")[1].split("</"+tagName+">")[0]; 
} 

Dieser Code sieht echt, aber wenn ich diesen Code ausgeführt, war ich erwartet, dass das Ergebnis wie diese haben:

[{"user":"user1","email":"[email protected]"},{"user":"user2","email":"[email protected]"}] 

aber was ich habe ist dies:

[{"user":"user2","email":"[email protected]"},{"user":"user2","email":"[email protected]"}] 

Die einzige Antwort auf dieses Problem ich heraus könnte, ist "es PASS BY ADRESSE ", so wurde mein erstes Ergebnis in List von der zweiten Iteration beeinflusst.

Die Frage möchte ich fragen: jemand die Art und Weise weiß das Ergebnis, das ich wollte zu bekommen?

Ich erwarte nicht die Antwort, mir zu sagen, mehrere HashMaps am Anfang zu definieren, da meine Rohdaten mehr "" enthalten könnten, was bedeutet, dass es so viele "USER" - und "MAIL" -Daten wie möglich enthalten könnte .

+0

Dieser Code nicht ist [MCVE]. Insbesondere zeigt es nicht, wo "map" definiert ist. Wenn ich raten würde, ist das dein Problem. Sie erstellen nicht jedes Mal eine neue Instanz von 'map', wenn Sie mit der Analyse eines neuen Benutzereintrags beginnen - so werden die Werte im alten einfach immer überschrieben. ('hmap' soll" map "sein?). – Tibrogargan

+0

Tippfehler, jetzt wurde es korrigiert. – Kaninchen

+0

@Tribrotargan heißt das, dass ich neue HashMap bei jeder Iteration innerhalb der While-Schleife dynamisch definieren muss? – Kaninchen

Antwort

0

hmap wird in Ihrem Code wiederverwendet, die Werte werden überschrieben. Wenn Sie es zur Liste hinzufügen, fügen Sie einfach eine neue Referenz zu demselben Objekt hinzu.

List<HashMap> list = new ArrayList<>(); 
HashMap<String, String> hmap; 
String raw = "<CONTENT><DETAIL><USER>user1</USER><MAIL>[email protected]</MAIL></DETAIL><DETAIL><USER>user2</USER><MAIL>[email protected]</MAIL></DETAIL></CONTENT>"; 
String partRas = ""; 
int index = raw.indexof("<USER>"); 

while(index >= 0) { 
    if(index + 50 < raw.length()) 
     partRaw = raw.subString(index, index + 50); 

    /* 
    * Create a new, empty HashMap 
    */ 
    hmap = new HashMap<>(); 
    hmap("user", getTagValue(partRaw, "USER")); 
    hmap("email", getTagValue(partRaw, "MAIL")); 
    list.add(hmap); 

    raw = raw.subString(index + 50, raw.length()); 
    index = raw.indexof("<USER>"); 
} 

System.out.println(new Gson().toJson(list)); 

public static String getTagValue(String xml, String tagName){ 
    return xml.split("<"+tagName+">")[1].split("</"+tagName+">")[0]; 
} 

Sie können tatsächlich wollen, dies überprüfen (auch wenn die Fehlerprüfung jämmerliche ist):

String raw = "<CONTENT><DETAIL><USER>user1</USER><MAIL>[email protected]</MAIL></DETAIL><DETAIL><USER>user2</USER><MAIL>[email protected]</MAIL></DETAIL></CONTENT>"; 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder; 

try { 
    dBuilder = dbFactory.newDocumentBuilder(); 
    Document doc = dBuilder.parse(new ByteArrayInputStream(raw.getBytes())); 
    NodeList nodes = doc.getElementsByTagName("DETAIL"); 
    for (int idx = 0; idx < nodes.getLength(); idx++) { 
     Node node = nodes.item(idx); 
     System.out.println("User: "+((Element)node).getElementsByTagName("USER").item(0).getTextContent()); 
     System.out.println("Mail: "+((Element)node).getElementsByTagName("MAIL").item(0).getTextContent()); 
    } 
} catch (Exception ex) { 
    // do stuff 
} 
+0

hmm, sehen aus wie ich keine andere Wahl haben, sondern verwenden die dynamische definieren. Ich dachte, die 'add()' Funktion von List wäre nach Wert, aber nach diesem Fehler denke ich, dass ich falsch lag. – Kaninchen

+0

@Kaninchen Java wird nicht durch Wert übergeben, außer für primitive Typen. – Tibrogargan

+0

gelernt zu viel von Zeigern Sachen vor, so dass dieser Bug mir verwirrte, weil ich nicht '*' sah oder '&' in Funktion der Parameter-Feld auf Oracle doc. Deshalb denke ich, dass es vorher wert ist. – Kaninchen