我有一个带有重复键的json,如下所示:
{"a":{
"stateId":"b",
"countyId":["c"]
},"a":{
"stateId":"d",
"countyId":["e"]
}}
当我使用JSON.parse
或JSON(stirng)
时,它会解析并向我提供值d, e
的密钥。我需要解析json,以避免解析相同的密钥两次,并且密钥b, c
而不是'a'
的值为'd', 'e'
。
答案 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"]}}