我有一个包含一些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);
答案 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的一些文档: