“意外的标记 。” 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