我需要解析一个json文件,不幸的是,该文件不遵循原型。我的数据有两个问题,但是我已经找到了解决方法,所以我只在最后提一下,也许有人也可以提供帮助。
所以我需要解析这样的条目:
"Test":{
"entry":{
"Type":"Something"
},
"entry":{
"Type":"Something_Else"
}
}, ...
json默认解析器更新字典,因此仅使用最后一个条目。我不得不以某种方式存储另一个,我也不知道如何做到这一点。我还必须将密钥以它们在文件中出现的顺序存储在几个字典中,这就是为什么我使用OrderedDict这样做的原因。它工作正常,所以如果有任何办法可以用重复的条目来扩展它,我将不胜感激。
我的第二个问题是,这个非常相同的json文件包含如下条目:
"Test":{
{
"Type":"Something"
}
}
当Json.load()函数到达json文件中的该行时,将引发异常。解决此问题的唯一方法是自己手动卸下内支架。
提前致谢
您可以用JSONDecoder.object_pairs_hook
来自定义JSONDecoder
解码对象的方式。该挂钩函数将传递一个(key, value)
通常会对其进行一些处理的成对列表,然后变成dict
。
但是,由于Python字典不允许重复的键(而且您根本无法更改键),因此在(key, value)
解码JSON时,可以在挂钩中保持不变地返回对,并获得对的嵌套列表:
from json import JSONDecoder
def parse_object_pairs(pairs):
return pairs
data = """
{"foo": {"baz": 42}, "foo": 7}
"""
decoder = JSONDecoder(object_pairs_hook=parse_object_pairs)
obj = decoder.decode(data)
print obj
输出:
[(u'foo', [(u'baz', 42)]), (u'foo', 7)]
您如何使用此数据结构取决于您。如上所述,Python字典不允许重复的键,而且没有办法解决。您甚至将如何基于密钥进行查找?dct[key]
会模棱两可。
因此,您既可以实现自己的逻辑来按期望的方式处理查找,也可以实现某种避免碰撞的功能,以使键(如果不是)变得唯一, 然后 从嵌套列表中创建字典。
编辑 :既然您说过要修改重复键以使其唯一,请按照以下步骤操作:
from collections import OrderedDict
from json import JSONDecoder
def make_unique(key, dct):
counter = 0
unique_key = key
while unique_key in dct:
counter += 1
unique_key = '{}_{}'.format(key, counter)
return unique_key
def parse_object_pairs(pairs):
dct = OrderedDict()
for key, value in pairs:
if key in dct:
key = make_unique(key, dct)
dct[key] = value
return dct
data = """
{"foo": {"baz": 42, "baz": 77}, "foo": 7, "foo": 23}
"""
decoder = JSONDecoder(object_pairs_hook=parse_object_pairs)
obj = decoder.decode(data)
print obj
输出:
OrderedDict([(u'foo', OrderedDict([(u'baz', 42), ('baz_1', 77)])), ('foo_1', 7), ('foo_2', 23)])
该make_unique
函数负责返回无冲突键。在这个例子中,它只是后缀与关键_n
地方n
是一个递增计数器-只是它适应您的需求。
由于object_pairs_hook
完全按照JSON文档中出现的顺序接收对,因此也可以使用来保留该顺序OrderedDict
,我也将其包括在内。
问题内容: 我似乎无法使实例正常工作。我使用的代码如下: 子类 该代码输出 问题答案: 您需要覆盖。而不是这样做,您实现了一个带有signature 的方法。因此,您使用的是为相等性测试定义的默认方法。 默认实现基于对象标识,因此,该集合“允许”您添加两个在语义上相等的不同对象。
问题内容: 我需要对元素进行排序,但不会删除重复项。 我已经去了,因为实际上将值添加到支持的: 然后TreeMap使用 逻辑删除重复项 我写了一个在元素相等的情况下返回1而不是0的a 。因此,在元素相等的情况下,带有此元素将不会覆盖重复项,而只会对其进行排序。 我已经为简单对象测试过,但是我需要一组自定义对象。 这种方法是好的还是有更好的方法来实现呢? 编辑 实际上,我有以下类的ArrayList
我正在检查< code>HashSet的< code>add方法。有人提到 如果该集合已经包含元素,则调用保持集合不变,并返回false。 但是方法在内部保存中的值 的方法声明 将指定值与该映射中的指定键相关联。如果映射先前包含该键的映射,则旧值将被替换。 那么,如果 的 方法替换了旧值,那么 方法如何在元素重复的情况下保持集合不变?
null
我定义了一个自定义过滤器,如下所示: 正如您所看到的,使用过滤器的ng repeat嵌套在另一个ng repeat中 过滤器的定义如下: 我得到: 错误:中继器中不允许重复。复读机:评论在item.comments|范围:1:2ngRepeatAction@https://ajax.googleapis.com/ajax/libs/angularjs/1.1.4/an
我有 REGEX,我希望在下面排除某些字符。正确排除这些字符:£“~#¬|{} 但这些不是: @[]/?;: 因此,例如,test£test 被正确标识为无效,但test@test被错误地标识为有效。 在https://regex101.com/上测试发现问题在于括号,并指出我需要转义第一个([括号]和-[连字符],就像这样- ^[a-zA-z0-9!$%^ 有什么办法可以让这个正则表达式按照我想