我正在尝试解析Oracle 11g数据库中的数据。我设置的许多列都包含前导零(0.1,0.99,...)的十进制值。列数据格式为NUMBER(10,2),对SQL Developer中的数据执行基本查询显示前导零。
尝试调用JSON.Parse时,出现“意外令牌”错误。
我假设JSON.Parse无法识别前导零。如果我在JSON.Parse之前执行初始查询时将数据类型转换为字符串,我没有任何问题。我试图避免这种情况,因为这意味着我将在以后进行类型转换以对数据执行计算。
以下是在解析之前使用TO_CHAR()的数据格式的工作示例:
{"row":[{"PERCENT_WORK_COMPLETE":" 0.99", -- Requires TO_CHAR b/c of leading zero. Fails without conversion.
"FINISH_VARIANCE":-242, --Number with no conversion. This works because there are no values containing decimals with leading zero.
}]}
有没有人建议如何保留Number数据类型并仍然可以使用JSON.Parse?我看到JSON.Parse有一个“Reviver”参数... JSON.parse(text [,reviver])我不知道我怎么能用它来做我想要完成的事情。感谢帮助。
修改 的
上面显示的示例对象存储为名为ajaxResponse的变量。
console.log("ajaxResponse", ajaxResponse); --this is what I am using to display the above example.
这就是我试图解析数据的方式:
jsonobj = JSON.parse(ajaxResponse);
在上面的示例中,“PERCENT_WORK_COMPLETE”列已在运行JSON.Parse之前转换为字符串。 “FINISH_VARIANCE”列已保留为数字。这很有效。
但是,如果我不将“PERCENT_WORK_COMPLETE”转换为字符串(即将其保留为0.99,而不是“0.99”),则解析将失败。
在运行JSON.Parse之后查看对象,使用上面的示例,我的对象包含“PERCENT_WORK_COMPLETE”的字符串值和“FINISH_VARIANCE”的数字值,正如我所期望的那样。
答案 0 :(得分:1)
如果我在JSON.Parse之前执行初始查询时将数据类型转换为字符串,那么我没有任何问题。
那是因为JSON.parse()
需要一个字符串,而不是一个对象。我假设你直接使用了JSON,就像这样(在PHP中):
var data = <?= json_encode(someData) ?>
//which would end up like this, a direct object
var data = {"foo":"bar"};
//instead of a string
var data = '{"foo":"bar"}';
使用前者而不是后者会抛出一个解析错误。您可以通过在控制台中执行以下操作来验证:
JSON.parse({"foo":"bar"}) // will fail
JSON.parse('{"foo":"bar"}') // will return an object
这意味着我将在以后进行类型转换以对数据执行计算。
如果您希望某些数据是数字但当前是字符串,那么您可以使用简单的+
进行转换。
var number = +" 0.99" //number === 0.99