【问题标题】:Replacing -INF in the JSON before processing it在处理之前替换 JSON 中的 -INF
【发布时间】: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.。此外,-INFFailCounts 的想法是错误的,可能是由于被零除不正确造成的。如果缺少值,请使用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,否则人们可能已经建议了该解决方案

标签: c# json json.net


【解决方案1】:

首先只是一个小问题:“我有一个 .jsonl 文件(即每一行都有一个有效的 json)...” 从技术上讲,it is not valid json,因为-INF 被禁止JSON 标准。所以,实际上,您是在问如何将“看起来像 JSON 但不是”的东西转换为有效的 JSON。

话虽如此,您基本上希望将所有-INF 替换为有效的JSON 值(例如0"-INF")。您需要忽略引号内的-INF,因为它可能(有效地)出现在字符串或成员名称中。

不幸的是,JSON 允许转义引号 (\"),这使事情变得更加复杂。令人惊讶的是,我没有在 SO 上找到现成的实现,它 (a) 仅在文本出现在双引号之外时替换文本,并且 (b) 可以处理 C 样式的转义引号。但是,这样的解析器的实现应该相当简单,我会给你一些伪代码来帮助你开始:

insideQuotes = false

loop through chars:

    if char = '\':
       skip next char       // this is necessary to ignore escaped quotes

    else if char = '"':
       toggle insideQuotes

    else if not insideQuotes and the next 4 chars are "-INF":
       replace them

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2016-12-31
    • 1970-01-01
    • 2021-12-20
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多