2016-04-03 14 views
0

Ich verwende die org.json Bibliothek, wie weiter unten zu sehen ist, von XML zu JSONXML zu JSON Herstellung von unerwünschten Ergebnissen

<dependency> 
     <groupId>org.json</groupId> 
     <artifactId>json</artifactId> 
     <version>20160212</version> 
    </dependency> 

Ein einfacher Testfall zu konvertieren zeigt das Problem, das ich habe, siehe unten: -

ich habe die folgende XML

<record> 
    <name>A108B</name> 
</record> 

was wiederum produziert

{"record": { "id": "A108B" }} 

Großartig! Das Problem tritt auf, wenn id

wird mit dem folgenden Code

XML.toJSONObject(xml...) 

I

{"record": { "name": 1111 }} 

bekomme ich die Werte tatsächlich als alle Saiten halten würde es vorziehen, das heißt Benutzerkennungen. Ich möchte nicht, dass sich die Ausgabe ändert, je nachdem, ob der Bezeichner zufällig kein Zeichen enthält.

Gibt es eine Möglichkeit, dies zu tun org.json zwingen kann? Ich kann den Code wahrscheinlich abzweigen und eine Änderung für mich selbst vornehmen, aber ich würde erwarten, dass dies ein Problem ist, auf das jemand anderes gestoßen ist und eine Lösung dafür hat.

+0

Das Werkzeug bei http://www.utilities-online.info/xmltojson/#.VwFtQBMrJmB scheint zu konvertieren, wie ich sehen möchte. – chrisw

Antwort

1

Dies scheint den Trick zu tun, ich hatte die nextValue von JSONTokener außer Kraft zu setzen.

String xml = "<test>111</test>"; 
    JSONObject json = XML.toJSONObject(xml); 
    JSONTokener tokener = new JSONTokener(json.toString()) { 
     public Object nextValue() throws JSONException { 
      Object nextValue = super.nextValue(); 
      if (nextValue instanceof Number) { 
       Number value = (Number) nextValue; 
       return value.toString(); 
      } 
      return nextValue; 
     } 
    }; 
    json = new JSONObject(tokener); 
    System.out.println(json.toString()); 

Ausgang: {"test":"111"}

0

XML.toJSONObject(...) ruft intern static Object stringToValue(String string), die wird immer versuchen, den Wert zu Boolean, JSONObject.Null, Long und Double zuerst zu konvertieren, und gibt eine String nur, wenn alle Bekehrungsversuche scheitern. Es scheint keinen (einfachen) Weg zu geben.

Statt Forking oder eine Reflexion Magie zu tun, können Sie einfach den Wert umrechnen beim Lesen:

JSONObject rec = json.getJSONObject("record"); 
String name = rec 
       .get("name") 
       .toString(); 

// optionally put the string value back into your JSON: 
rec.put("name", name); 
+0

Leider vereinfacht der Testfall, den ich gemacht habe, die xml/json, sehr. Wenn ich die gesamte Hierarchie zu durchlaufen wäre, würde ich wahrscheinlich besser, meine eigenen xml json Konverter schreiben – chrisw

+0

@chrisw Ich denke, dann die beste Option, um die 'XML' Utility-Klasse kopiert werden und ersetzen Sie das' statische Objekt stringToValue (String String) 'Methode mit eigener Implementierung. – nyname00

Verwandte Themen