1

私のxmlには、属性値から破棄される次のコードに従ってxmlからjsonに変換した後、文字列として扱いたい属性値「0123」が含まれています。

使用クラス

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.json.JSONObject;
import org.json.XML;

//xml を json に変換

    org.jdom.Document jdomDocument = new Document();
    org.jdom.Element Attribute = new org.jdom.Element("Attribute");
    jdomDocument.setRootElement(Attribute);

    org.jdom.Element valueElement = new  org.jdom.Element("Value");
    valueElement.setText(getValue()); // "0123"
   // getValue() return anything like boolean,string,long,date, time etc..

     root.addContent(valueElement);
    String xmlval = new    XMLOutputter(Format.getPrettyFormat()).outputString(jdomDocument);
    JSONObject xmlJSONObj = XML.toJSONObject(xmlval);
    String jsonPrettyPrintString = xmlJSONObj.toString(4);

この問題を解決するには?

4

2 に答える 2

2

XML.javaのコードを見ると、特に stringToValue メソッドが

"Try to convert a string into a number, boolean, or null".  

コードは以下のとおりです。最初に数値として解析しようとすることがわかります。この場合、先頭のゼロが削除されます。テストするには、文字列に数字以外の文字を追加してみてください。そうすれば、先頭のゼロが保持されると思います。

あなたが見ている動作はライブラリに焼き付けられているようです。関数 toJSONObject のドキュメントは警告しますが、これは素晴らしいことではありません

"Some information may be lost in this transformation because JSON is a data format and XML is a document format"

コード :

// If it might be a number, try converting it. If that doesn't work,
// return the string.

        try {
            char initial = string.charAt(0);
            boolean negative = false;
            if (initial == '-') {
                initial = string.charAt(1);
                negative = true;
            }
            if (initial == '0' && string.charAt(negative ? 2 : 1) == '0') {
                return string;
            }
            if ((initial >= '0' && initial <= '9')) {
                if (string.indexOf('.') >= 0) {
                    return Double.valueOf(string);
                } else if (string.indexOf('e') < 0 && string.indexOf('E') < 0) {
                    Long myLong = new Long(string);
                    if (myLong.longValue() == myLong.intValue()) {
                        return new Integer(myLong.intValue());
                    } else {
                        return myLong;
                    }
                }
            }
        } catch (Exception ignore) {
        }

編集:これはライブラリのバグのようです。使うべきだと思います

(negative ? 1 : 0)

現在の動作では、先行ゼロが 1 つある値が数値として誤って解釈されるためです。質問者が確認したように、2 つ以上の先行ゼロを文字列として正しく認識します。

于 2013-08-08T09:17:11.190 に答える