Java中的JSON解析器自动将String转换为数字/整数

时间:2016-07-13 16:18:57

标签: java json

我有一个包含一些String变量的Java对象。当从Java对象创建json消息时,如果其中一个String值是字母数字,则转换将返回带引号的值。否则转换将返回一个数值。

示例:

Class User {
   String userid , password;
}

如果userid = "tom"password = "123456"则JSON转换返回

"userid":"tom""password":123456(数字)

它应该实际返回"password":"123456"

我怎样才能做到这一点?我正在使用json.org中的Java解析器,下面是一段将Java对象转换为Json的代码。

final JSONObject jsonObject = XML.toJSONObject(writer.toString());
res = jsonObject.toString(4);

2 个答案:

答案 0 :(得分:1)

这是因为stringToValue中的JSONObject方法。 它试图猜测一种类型。 它是开源的,所以你可以根据需要改变它。 只需返回字符串。

/**
 * Try to convert a string into a number, boolean, or null. If the string
 * can't be converted, return the string.
 *
 * @param string
 *            A String.
 * @return A simple JSON value.
 */
public static Object stringToValue(String string) {
    if (string.equals("")) {
        return string;
    }
    if (string.equalsIgnoreCase("true")) {
        return Boolean.TRUE;
    }
    if (string.equalsIgnoreCase("false")) {
        return Boolean.FALSE;
    }
    if (string.equalsIgnoreCase("null")) {
        return JSONObject.NULL;
    }

    /*
     * If it might be a number, try converting it. If a number cannot be
     * produced, then the value will just be a string.
     */

    char initial = string.charAt(0);
    if ((initial >= '0' && initial <= '9') || initial == '-') {
        try {
            if (string.indexOf('.') > -1 || string.indexOf('e') > -1
                    || string.indexOf('E') > -1
                    || "-0".equals(string)) {
                Double d = Double.valueOf(string);
                if (!d.isInfinite() && !d.isNaN()) {
                    return d;
                }
            } else {
                Long myLong = new Long(string);
                if (string.equals(myLong.toString())) {
                    if (myLong.longValue() == myLong.intValue()) {
                        return Integer.valueOf(myLong.intValue());
                    }
                    return myLong;
                }
            }
        } catch (Exception ignore) {
        }
    }
    return string;
}

答案 1 :(得分:0)

您可以使用staxon库:它的JsonXMLConfigBuilder允许您控制转换期间的行为(例如autoprimitive,它允许您定义如何处理原始值)。这是代码:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><userid>tom</userid><password>123456</password></root>";
ByteArrayOutputStream bao = new ByteArrayOutputStream();
JsonXMLConfig config = new JsonXMLConfigBuilder().autoArray(true).autoPrimitive(false).prettyPrint(true).build();
try {
    XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(IOUtils.toInputStream(xml));
    XMLEventWriter writer = new JsonXMLOutputFactory(config).createXMLEventWriter(bao);

    writer.add(reader);
    reader.close();
    writer.close();
} finally {
    bao.close();
}

String json = bao.toString();

JsonXMLConfigBuilder()...autoPrimitive(false)执行您正在寻找的技巧:数字字段保存为字符串。

使用此代码示例,您需要添加Saxion + commons-io(仅适用于IOUtils.toInputStream(xml)):

<dependency>
    <groupId>de.odysseus.staxon</groupId>
    <artifactId>staxon</artifactId>
    <version>1.3</version>
</dependency>

<dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.4<version>
</dependency>

关于staxon的一些文档: