在ruby中解析带有重复键的json字符串

时间:2013-09-15 01:20:13

标签: ruby json

我有一个带有重复键的json,如下所示:

{"a":{
"stateId":"b",
"countyId":["c"]
},"a":{
"stateId":"d",
"countyId":["e"]
}}

当我使用JSON.parseJSON(stirng)时,它会解析并向我提供值d, e的密钥。我需要解析json,以避免解析相同的密钥两次,并且密钥b, c而不是'a'的值为'd', 'e'

2 个答案:

答案 0 :(得分:1)

有一种方法。您可以使用自定义对象类进行“预解析”。 如果键重复,则标记为[X]的行将引发异常。可能存在一种将两个解析调用组合为一个的方法。谁能看到该怎么做?

class DuplicateKeyChecker
  def []=(key, _value)
    @keys ||= []
    if @keys.include?(key)
      fail key
    else
      @keys << key
    end
  end
end

JSON.parser = JSON::Ext::Parser
JSON.parse(doc, { object_class:DuplicateKeyChecker }) # [X]
json = JSON.parse(doc)

答案 1 :(得分:0)

这一切都取决于你的字符串的格式。如果它像您发布的一样简单:

require 'json'

my_json =<<END_OF_JSON
{"a":{
"stateId":"b",
"countyId":["c"]
},"a":{
"stateId":"d",
"countyId":["e"]
},"b":{
"stateId":"x",
"countyId":["y"]
},"b":{
"stateId":"no",
"countyId":["no"]
}}
END_OF_JSON


results = {}

hash_strings = my_json.split("},")

hash_strings.each do |hash_str|
  hash_str.strip!

  hash_str = "{" + hash_str if not hash_str.start_with? "{"
  hash_str += "}}" if not hash_str.end_with? "}}"

  hash = JSON.parse(hash_str)

  hash.each do |key, val|
    results[key] = val if not results.keys.include? key
  end

end

p results

--output:--
{"a"=>{"stateId"=>"b", "countyId"=>["c"]}, "b"=>{"stateId"=>"x", "countyId"=>["y"]}}