【发布时间】:2021-05-31 10:55:52
【问题描述】:
我有一个 JSON 文件,其中有整数、数组、字符串等数据类型……当我的一个有效 JSON 的数组属性具有类似 "power":[-INF, -INF, 6,-8.98] 的数据时,在 C# 中读取文件时会出现问题。
现在我知道,现代 JSON 解析器不支持 -INF 值,这就是发生此错误的原因。因此,一种解决方法是将我的数据文件中的 -INF 替换为“-Infinity”之类的内容。
有人可以帮助我优化代码,我可以在其中读取文件并替换 -INF 而不会破坏 JSON 文件中的任何其他内容,然后再进行任何进一步的转换。
我的 JSON 文件示例
{
"AppVersion":"testb0d",
"Bin":"P",
"FailCounts":[-INF,-INF,-INF,-INF,3.223622,-3.111,12,0,0]
}
【问题讨论】:
-
您不应该修复产生
-INF的代码吗? JSON 标准明确禁止依赖于实现的概念,例如 Infinity:Numeric values that cannot be represented in the grammar below (such as Infinity and NaN) are not permitted.。此外,-INF对FailCounts的想法是错误的,可能是由于被零除不正确造成的。如果缺少值,请使用NULL。 -
"我有一个 .jsonl 文件(即每一行都有一个有效的 json)..." 从技术上讲,it is not valid json。所以,实际上,您是在问如何将“看起来像 JSON 但不是”的东西转换为有效的 JSON。
-
不是有效的 JSON 不是因为每行有一个文档。它是无效的,因为它包含像
-INF这样的无效字符串。每行存储一个文档以用于流式传输是一种非常常见且古老的做法 - 以至于人们试图通过尝试将自己的名字贴在上面来劫持这种常见做法。没有jsonl、没有ndjson、没有jsonlines标准或格式。都是指人们已经做了很长时间的事情 - 每行存储一个未缩进的 json 文档 -
@Panagiotis 无法更改源,它现在不可能(我们已经讨论过该选项)不要在那里继续失败计数和其他术语,我只是想给出数据的想法,它的样子。如果我为每行 Jsonl 文件循环,我会得到一个有效的 json,我可以使用 newtonsoft 解析它。所以可以说我有一个带有 -INF 数据的有效 Json 文件
-
请不要坚持认为无效的
-INF值在任何情况下都是有效的。这就是阻止您解决此问题的原因。因为它是invalid,所以你不能使用任何开箱即用的解析器。您必须为该属性编写自己的自定义转换器并应用它with an attribute。您没有发布您的代码、类或说明您使用 JSON.NET,否则人们可能已经建议了该解决方案