【问题标题】:Parse JSON inside Array Rails在 Array Rails 中解析 JSON
【发布时间】:2020-01-02 10:29:03
【问题描述】:

我的 Rails 应用程序的数据库中有一个数组列。此列存储哈希数组。但它们作为字符串存储在数组中。我想将它们转换回哈希数组。

数据库列值。卡片

 ["{:card_number=>\"12345678\", :card_pin=>\"12345\", :validity=>Sat, 01 Feb 2020, :amount=>100}", "{:card_number=>\"76355859\", :card_pin=>\"4532\", :validity=>Sat, 01 Feb 2020, :amount=>100}", "{:card_number=>\"76354858\", :card_pin=>nil, :validity=>Sat, 01 Feb 2020, :amount=>100}", "{:card_number=>\"76254859\", :card_pin=>nil, :validity=>Sat, 01 Feb 2020, :amount=>100}"] 

我正在尝试解析它们并发送哈希数组作为响应。

JSON.parse(cards[0]) 

给予

 JSON::ParserError (767: unexpected token at '{:card_number=>"12345678", :card_pin=>"12345", :validity=>Sat, 01 Feb 2020, :amount=>100}')

如何将其转换为哈希数组。

【问题讨论】:

  • 那不是json。你负责序列化内容吗?这似乎是一个简单的inspect(将哈希转换为字符串)?使用.to_json 会好很多。

标签: arrays ruby-on-rails json parsing


【解决方案1】:

这太愚蠢了。不要使用数组列来存储哈希。当您想在数组中存储简单的标量类型(字符串、数字)时,数组列是特殊情况的解决方案。它不应该是您转到“将各种垃圾塞入”列类型。

更重要的是,不要使用 arrays/hstore/json/jsonb 来为应该有自己的表的数据建模。它们适用于特殊情况,即您的数据并不真正适合固定模式,但不应成为执行任何操作的默认方式。

仅通过查看该哈希值,您就可以看到数据实际上具有定义明确的模式,并且可以通过设置表和一对多关联来非常轻松地对其进行建模。这将使您能够有效地查询数据并为您提供参照完整性。

另外以明文形式保存卡号和密码是不负责任的。如果您有数据库泄露,并且攻击者获得了大量 CC 号码列表,您可能需要承担责任。

【讨论】:

    【解决方案2】:

    不是完整的答案,但这个 date:validity=>Sat, 01 Feb 202 应该被转义:
    :validity=>\"Sat, 01 Feb 2020\"。然后你可以做eval(cards[0])

    但请记住,使用eval 可能是一个安全漏洞,有人可以执行恶意代码。

    【讨论】:

    • eval 有安全漏洞。所以我不能在我的代码中使用它。还有其他选择吗?
    【解决方案3】:

    我只需要将散列转换为 json,然后再将其推入数组并保存即可。

    cards << { card_number: '123456', pin: '2345'}.to_json
    

    然后在检索时,我可以简单地执行以下操作。

    cards.map { |crd| JSON.parse(crd) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多