ruby-on-rails - 有没有办法在 Ruby 中用尾随逗号解析 JSON?

标签 ruby-on-rails json ruby

我目前正在编写从使用手工制作的 JSON 文件的系统到可以自动生成 JSON 文件的系统的转换。旧系统有效;新系统有效;我需要做的是将数据从旧系统传输到新系统。

iOS 应用程序使用 JSON 文件来提供功能,之前我们的服务器软件在 Ruby On Rails 中从未读取过这些文件。为了在原始系统和新系统之间进行转换,我已经开始解析现有的 JSON 文件。

问题是我的前两个示例文件之一在 JSON 中有尾随逗号:

{ "sample data": [1, 2, 3,] }

这显然在 iOS 应用程序中进行得很好,因为该文件已经使用了一段时间。现在,我需要一些方法来解析我的 Ruby on Rails 服务器中文件中提供的数据,这(非常正确地)抛出 JSON 文件中非法尾随逗号的异常。

我不能只对代码进行 JSON.parse,因为解析器理所当然地将其作为无效 JSON 拒绝。有什么方法可以解析它——我可以传递给 JSON.parse 的选项,或者添加一些东西的 gem,等等?或者我是否需要报告我们必须在自动化流程处理损坏的文件之前手动修复它们?

编辑:

根据评论和请求,似乎需要一些额外的数据。有问题的 JSON 文件存储在 S3 上的 .zip 文件中,通过 ActiveStorage 存储。我正在编写的过程需要下载、解压缩和解析 zip 文件,使用“manifest.json”文件作为 key 将存档文件转换为数据库结构,其中多个较小的文件存储在 S3 上,而不是单个文件包含所有内容的 zip。一个(非常)长期的目标是让客户停止下载单一的 zip 文件,而是单独下载文件。第一步是在服务器 上分解 zip 文件,这意味着服务器需要读取 zip 文件。下面是更详细的数据样本。 (请注意,该结构包含几个我后来后悔的设计决定;最初的想法之一是能够重复使用文件,而不是打包同一文件的多个副本,但 YAGNI 在后面咬了我)

以下包括不合法的 JSON 格式注释:

{
  "defined_key": [
    {
      "name": "Object_with_subkeys",
      "key": "filename",
      "subkeys": [
        {
          "id":"1"
        },
        {
          "id":"2"
        },
        {
          "id":"3" // references to identifier on another defined key
        }, // Note trailing comma
      ]
    }
  ],
  "another_defined_key":[
    {
      "identifier": "should have made parent a hash with id as key instead of an array",
      "data":"metadata",
      "display_name":"Names: Can be very arbitrary",
      "user text":"Wait for the right {moment}", // I actually don't expect { or } in the strings, but they're completely legal and may have been used
      "thumbnail":"filename-2.png",
      "video-1":"filename-3.mov"
    }
  ]
}

最佳答案

问题是您正在尝试解析看起来很像 JSON 但实际上不是规范定义的 JSON 的东西。

Arrays- An array structure is a pair of square bracket tokens surrounding zero or more values. The values are separated by commas.

因为你有一个尾随逗号,另一个值也是预期的,大多数 JSON 解析器会由于这种违规而引发错误

话虽如此json-next将适本地解析这个也许可以试一试。

它可以根据您使用的风格解析完全违反 JSON 规范的类似 JSON 的表示形式。 (在 gem 中定义的 HanSON、SON、JSONX)

示例:

json = "{ \"sample data\": [1, 2, 3,] }")
require 'json/next'
HANSON.parse(json)
#=> {"sample data"=>[1, 2, 3]}

但是下面是等价的并且完全违反了规范

JSONX.parse("{ \"sample data\": [1 2 3] }")
#=> {"sample data"=>[1, 2, 3]} 

因此,如果您选择这条路线,不要期望以任何方式使用它来验证 JSON 数据或结构,您最终可能会得到意想不到的结果。

关于ruby-on-rails - 有没有办法在 Ruby 中用尾随逗号解析 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58291445/

相关文章:

mysql - 使用 ActiveRecord 延迟删除 MySQL 中的临时表

ruby-on-rails - GitLab 5.0 在创建新项目后在项目设置页面上产生错误 500

java - 用于异构 Multimap 的 Gson 适配器

ruby - 使用 QtRuby 获取对发射小部件的引用

ruby-on-rails - 设置 PayPal 自适应支付流程

ruby-on-rails - 为什么我得到未定义的方法 `cookies' ?

ruby-on-rails - Prawn PDF : I need to generate nested tables

objective-c - 使用 objective-c 从 json 中检索值

javascript - 在 Node.js 中将 log4j 错误流解析为 JSON

ruby-on-rails - 在 rails 3 中形成带有 mustache 的助手