“意外的标记 。” JSON Parse无法使用前导零解析十进制

时间:2013-12-26 15:30:37

标签: javascript sql json parsing oracle11g

我正在尝试解析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”的数字值,正如我所期望的那样。

1 个答案:

答案 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