【问题标题】:Parsing or fixing JSONs with special 'undefined' values?解析或修复具有特殊“未定义”值的 JSON?
【发布时间】:2019-12-12 12:17:14
【问题描述】:

除了字符串和数字之外,有效的 JSON 还可以包含特殊值,例如 nullfalse

我需要解析由某些 API 生成的 JSON,其中还包含 undefined。然而,undefined 是一个 valid JavaScript value,但它不是一个有效的 JSON 值,每当我解析它时,它都会返回一个词法错误

示例:

library(jsonlite)

# A string works
"[{\"Sepal.Width\":\"3.5\"}]" %>% fromJSON
#  Sepal.Width
#         3.5

# A number works
"[{\"Sepal.Width\":3.5}]"  %>% fromJSON
#  Sepal.Width
#         3.5

# null works
"[{\"Sepal.Width\": null}]" %>% fromJSON
#  Sepal.Width
#          NA

# false works
 "[{\"Sepal.Width\": false}]" %>% fromJSON
#  Sepal.Width
#       FALSE

# undefined does not work
 "[{\"Sepal.Width\": undefined}]" %>% fromJSON
Error: lexical error: invalid char in json text.
                      [{"Sepal.Width": undefined}]
                     (right here) ------^

问题:

是否有任何(可靠的)方法来解析包含 undefined 值的 JSON?如果没有,修复这个错误 JSON 的最佳方法是什么?

尝试:

我曾考虑过简单地 gsubbing undefined,但这样做有风险,因为该词很容易出现在 JSON 字符串值中。

【问题讨论】:

  • 由于undefined 不是一个有效的 JSON 值,您不太可能找到将其视为一个的解析器。首先,您是如何在 JSON 中获取 undefined 的?
  • @SymbolixAU 我试图解析的一些 JSON 中有一个错误,它导致(无效的)undefined 出现在其他有效的 JSON 中。我尝试克隆 jsonlite 源并进行调整,以便 undefined 可以被解析为布尔值或 null,但我并没有走得太远。 Here 是无效 JSON 的来源。
  • @user5783745 您的 JSON 生成器很可能有问题。
  • @Ḿűỻịgǻṇạcểơửṩᛗ 我知道。虽然这不是我的 API。我只是试图解析它产生的响应(我无法控制响应以及 JSON 的有效性,我只能控制如何解析响应)。其他人指出响应不是有效的 JSON,我完全理解。我认为最好的解决方案是将响应读取为文本并将undefined 替换为false。不过这是有风险的,因为它可能会更改实际的字符串值(例如,如果'undefined' 出现在JSON 的字符串值中)。
  • @Ḿűỻịgǻṇạcểơửṩᛗ 请参阅here

标签: javascript r json undefined jsonlite


【解决方案1】:

不行。不能解析具有未定义值的 JSON; undefined 确实是一个特殊的值。事实上,undefined 作为“值”不能出现在有效的 JSON 中,并且旨在表示“此键 [在您的情况下,"Sepal.Width"] 不存在。”相反,API 可能有问题,它正在生成带有 undefined 值的 JSON。

官方来源,The JSON Data 交换语法,指出

JSON 值可以是对象、数组、数字、字符串、true、false 或 null。

最好的补救办法是检查 JSON 生成器或 API,以及它为什么在 JSON 中生成 undefined。您还可以手动或通过算法修复有缺陷的 JSON,并检查您的 JSON 中是否存在任何不一致。

【讨论】:

    【解决方案2】:

    为了记录,我使用str_replace_all():undefined 替换为:"undefined"

    这有点冒险,因为如果字符串 :undefined 恰好出现在 JSON 中的实际字符串值中,则会导致问题,但在我的情况下,这是(一个不完美的)解决方案

    str_replace_all(invalid_json, ':undefined', ':"undefined"')
    

    【讨论】:

    • 这是一个好方法。要验证这样的解决方案,请检查所有出现的 undefined 并确保您的替换不会导致任何意外行为。您认为您现在在问“如何删除无效生成的 JSON 中的未定义值?”
    • @Ḿűỻịgǻṇącểơửṩᛗ 我想是的。最初我希望有某种方法可以将无效的 JSON 解析为一些 javascript 变体(因为undefined)是有效的 javascript,然后转换为有效的 JSON。但我认为这种方法是不可能的
    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2020-08-25
    • 2011-06-14
    • 2016-07-20
    相关资源
    最近更新 更多