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

java中的xml到json转换问题,第一个前导零丢弃的fom字符串,java,xml,json,Java,Xml,Json,我的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

我的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);
如何解决此问题?

查看-尤其是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) {
        }
因为当前行为错误地将一个前导为零的值解释为一个数字。它正确地将两个或多个前导零识别为字符串,这一点已被询问者确认。

它可以工作:)

在CDATA部分增加了值,因此在从xml转换为json时,值将按原样显示

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

@Qwerky问题编辑显然,这个库正在做一些猜测,以尝试猜测最适合使用的JSON数据类型。现在还不清楚你到底是想把0123当作一个字符串还是一个数字。如果你想将它作为一个数字,它必须是123而不是0123,因为JSON不允许前导零:这是因为在C和Java以及JS中,古老而可怕的传统是将以零开头的数字视为八进制。请查看更新的问题&我需要在代码中做什么更改?请尝试“0123A”,要检查这是否真的是问题所在@Graham Griffiths如果我附加'A',那么我在jsonString中得到了“0123A”。我只想要“0123”。老实说,它看起来像这个库代码中的一个bug,我认为它应该是(否定的:1:0),在这种情况下,它总是会考虑一个前导零来表示一个字符串。按照代码的原样,我认为需要两个前导零才能将其解释为字符串-在代码中使用“00123”是值得尝试的。我认为您在库中遇到了一个错误,您可以通过此页面进行报告:似乎当它得到一个前导零时,它会将该值视为一个数字而不是字符串(尽管它将正确处理两个或多个前导零)
   org.jdom.Element valueElement = new  org.jdom.Element("Value");
    org.jdom.CDATA cdata = new org.jdom.CDATA(getValue());
    valueElement.setText(cdata );