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

Posted

技术标签:

【中文标题】“意外的标记 。” JSON Parse 无法解析前导零的十进制【英文标题】:"Unexpected token ." JSON Parse Fails to Parse Decimal with Leading Zero 【发布时间】:2013-12-26 15:30:36 【问题描述】:

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

【问题讨论】:

你传递给parse()的确切字符串是什么? JSON.parse 对带有前导零的数字没有任何问题。这可以直接从浏览器的调试控制台轻松验证。 在我这边工作JSON.parse('"row":["PERCENT_WORK_COMPLETE":" 0.99","FINISH_VARIANCE":-242]') 您应该发布导致错误的实际 JSON。仅发布 不会 导致错误的 JSON 确实没有帮助。 【参考方案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

【讨论】:

我接受这个,因为它是一个非常简单的转换。我只是想确定在解析过程中是否有办法维护整数。 @thefreeline 前面的0 没有任何问题。 JSON.parse('"foo":0.99') 有效。 JSON 数据肯定有问题,您可以使用 JSON 验证器进行检查。

以上是关于“意外的标记 。” JSON Parse 无法解析前导零的十进制的主要内容,如果未能解决你的问题,请参考以下文章

跪求json无法解析的原因 String resJSON=JSON.toJSONString(ma

解析错误:意外的标记条带?夹板

解析没有键的多维 JSON 数组

控制台:SyntaxError:位置 0 处的 JSON 中的意外标记 < [重复]

使用JSON.parse解析数量

JSON.parse解析出错解决办法