我收到JSON
有效载荷,它是一组键值对。值可以是字符串或数字。我必须解析JSON
并将键值对存储到适当的varchar2
列中。我应该完全按照输入的有效载荷中输入的号码来保存输入的 。
但是对于像1.1E4
,0.00000000000003
之类的数字和类似的数字,我得到的是11000.0
,3.0E-14
。
这是一种禁用/阻止数字转换而只使用字符串表示的方法吗?
我使用FasterXML
Jackson
实现。
顺便说一句,没有可用的实际文档-我发现的所有来源都指向http://wiki.fasterxml.com/JacksonHome,该文档现在不可用。
我在这里发现了两个类似的问题
Jackson JSON converts integers into strings
Disable the Number to String automatic conversion in jackson
但是遇到数字时都需要例外,这不是我的情况。我尝试了建议的解决方案,但未能成功修改它们以适合我的任务。
也没有答案 https://github.com/FasterXML/jackson-databind/issues/796
现在,除了键值对之外,我没有输入字符串的规范。所以只是一个例子:
我可能会收到类似的消息:
{"a":"text","b":"35","c":{"d":"another"},"e":["array",35],"f":1.1E4,"g":0.00000000000003}
我想要字符串对
"a" -> "text","b" -> "35","c" -> "{\"d\":\"another\"}","e" -> "[\"array\",35]","f" -> "1.1E4"
最简单的转换方式是:
public void test() throws IOException {
Map map = new ObjectMapper().readValue(
"{\"a\":\"text\",\"b\":\"35\",\"c\":{\"d\":\"another\"},\"e\":[\"array\",\"f\":1.1E4,\"g\":0.00000000000003}",Map.class);
System.out.println(map);
}
结果:
{a=text,b=35,c={d=another},e=[array,f=11000.0,g=3.0E-14}
更准确的方法:
public class JsonUtil2 {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
public static Map<String,String> parse(String json) throws IOException {
ObjectNode objectNode = (ObjectNode) OBJECT_MAPPER.readTree(json);
Map<String,String> result = new HashMap<>(objectNode.size());
objectNode.fields().forEachRemaining(entry -> result.put(entry.getKey(),toJson(entry.getvalue())));
return result;
}
private static String toJson(JsonNode jsonNode) {
if (jsonNode.isnumber()) {
if (jsonNode instanceof DoubleNode || jsonNode instanceof FloatNode) {
DecimalFormatSymbols dfs = new DecimalFormatSymbols();
dfs.setDecimalSeparator('.');
dfs.setMinusSign('-');
DecimalFormat df = new DecimalFormat("#.#",dfs);
df.setMaximumFractionDigits(32);
df.setMaximumIntegerDigits(32);
return df.format(jsonNode.doubleValue());
} else {
return jsonNode.asText();
}
} else if (jsonNode.isValueNode()) {
return jsonNode.asText();
} else {
try {
return OBJECT_MAPPER.writeValueAsString(jsonNode);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
}
结果为:
{a=text,c={"d":"another"},e=["array",f=11000,g=0.00000000000003}
这要好得多,但在f=11000
而非f=1.1E4
上还是有所不同。