java中的xml到json转换问题,第一个前导零丢弃fom字符串

8qgya5xd  于 2023-08-08  发布在  Java
关注(0)|答案(2)|浏览(191)

我的xml包含属性值“0123”,我想将其视为字符串,在按照以下代码从xml转换为json后,前导零将从属性值中丢弃。
已使用的类别

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


该如何解决此问题?

mkshixfv

mkshixfv1#

查看code for 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) {
        }


编辑:这看起来像是图书馆里的一个bug。我认为应该用

(negative ? 1 : 0)


因为当前行为错误地将具有单个前导零的值解释为数字。它正确地识别两个或更多的前导零作为一个字符串,由询问者确认。

dgiusagp

dgiusagp2#

It works:)
在CDATA部分中添加了值,以便在从xml转换为json值时按原样显示

org.jdom.Element valueElement = new  org.jdom.Element("Value");
    org.jdom.CDATA cdata = new org.jdom.CDATA(getValue());
    valueElement.setText(cdata );

字符串

相关问题