【问题标题】:How to parse JSONB array of strings in Ruby如何在 Ruby 中解析 JSONB 字符串数组
【发布时间】:2020-03-22 06:23:39
【问题描述】:

我找到了很多解析 JSON 或 JSONB 的答案,但似乎 PostgreSQL 有自己的做事方式。

我有一个来自 PostgreSQL 的 CSV 转储文件,我想用 Ruby 进行解析。

转储的一列是用array_agg 创建的。它是一个字符串数组。不幸的是,PostgreSQL 决定不对某些值进行双引号。它可能认为它们是数字。

require 'json'

original_names = "[\"1800 Reposado 750ML\",1800Jalisco750ml,\"1800 Tequila Reposado, Jalisco, Mexico (750ml)\"]"
array = JSON.parse original_names
# Raises: 434: unexpected token at 'Jalisco750ml,"...' (JSON::ParserError)

我尝试自己添加引号,但由于其他字符串包含逗号而失败。

array = JSON.parse original_names.gsub(/,([^"|,]+),/, ',"\1",')
# Raises: 434: unexpected token at 'Jalisco", Mexico (750ml)"]' (JSON::ParserError)

我花了一个小时尝试解决方法,现在我相信我需要自己实现解析器。谁有更好的方法?

【问题讨论】:

  • 1800Jalisco750ml 这样的值必须用引号括起来
  • @SebastianPalma 没错,这是根本问题,有什么方法可以解析和容忍这些值吗?
  • 您不想尝试编写 CSV 解析器。 CSV 是一种非常混乱的数据格式,会遇到各种问题。 Ruby 的 CSV 解析器非常健壮,但是,同样,因为 CSV 是一团糟,所以总有可能会出现问题。在我看来,使用 JSON 或 YAML 是更好的选择。至于让您的问题悬而未决,请不要将您的解决方案放在问题本身中。而是创建一个解释和记录修复的答案。 SO 将开始倒计时,并在其到期后允许您选择该答案作为正确答案。也从您的问题中删除“编辑:”。 (并且不要使用“编辑”标签。)
  • 我删除了我的答案。您指出,“......但是,带有 , 的字符串似乎被分成了几个字符串,我需要避免这种情况。”我似乎错过了我的回答的效果。 :-)。

标签: json ruby postgresql


【解决方案1】:

"Array_agg in postgres selectively quotes" 表明 PostgreSQL 的 json_agg 返回正确的 JSON,这可以防止我的问题。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2016-07-25
    • 2014-07-24
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    相关资源
    最近更新 更多