我有一个Python对象方法,它使用json
模块将有序字典对象的集合作为JSON字符串写入具有UTF-8编码的文件。这是代码:
def write_small_groups_JSON_file( self, file_dir, file_name ):
with io.open( file_dir + file_name, 'w', encoding='utf-8' ) as file:
JSON_obj = ''
i = 0
for ID in self.small_groups.keys():
JSON_obj = json.dumps( self.small_groups[ID]._asdict(), ensure_ascii=False )
file.write( unicode( JSON_obj ) )
i += 1
print str( i ) + ' small group JSON objects successfully written to the file ' + \
file.name + '.'
此处small_groups
是名为SmallGroup
的命名元组对象的有序字典,其中键ID
是格式为(N,M)
的元组,其中N,M
为正整数,如果ID in small_groups.keys()
则small_groups[ID]._asdict()
是有序字典。以下是ID=(36,1)
的示例:
OrderedDict([('desc', ''), ('order', 36), ('GAP_ID', (36, 1)), ('GAP_desc', ''), ('GAP_pickled_ID', ''), ('is_abelian', None), ('is_cyclic', None), ('is_simple', None), ('is_nilpotent', None), ('nilpotency_class', None), ('is_solvable', None), ('derived_length', None), ('is_pgroup', None), ('generators', None), ('char_degrees', '[[1,4],[2,8]]'), ('D3', 68), ('MBS_STPP_param_type', (36, 1, 1)), ('Beta0', 36)])
文件中的JSON输出看起来被压扁,对象之间没有逗号,也没有打开和关闭大括号。看起来像这样
{ object1 }{ object 2 }.....
...........{ object n }.....
这是一种有效的JSON格式,还是我必须使用逗号分隔对象?
另外,如果我在某个地方有一个模式,是否有办法验证输出?
答案 0 :(得分:4)
不,你不再拥有有效的JSON;你将单独的 JSON对象(每个有效)写入一个没有任何分隔符的文件。
您必须先编写自己的分隔符,或首先生成一个长列表,然后将其写出来。
创建列表非常简单:
objects = []
for small_group in self.small_groups.values():
objects.append(small_group._asdict()))
with io.open( file_dir + file_name, 'w', encoding='utf-8' ) as file:
json_object = json.dumps(objects, ensure_ascii=False)
file.write(unicode(json_object))
print '{} small group JSON objects successfully written to the file {}.'.format(
len(objects), file.name)
这会写出JSON 一次,生成一个包含多个对象的JSON列表。
如果您要自己注入分隔符,则必须先编写[
,然后在生成的每个JSON对象后写一个逗号,除了最后一个,改为写]
:
with io.open( file_dir + file_name, 'w', encoding='utf-8' ) as file:
file.write(u'[')
for count, small_group in enumerate(self.small_groups.values()):
if count: # not the first
file.write(u',')
json_object = json.dumps(small_group, ensure_ascii=False)
file.write(unicode(json_object))
file.write(u']')
print '{} small group JSON objects successfully written to the file {}.'.format(
len(self.small_groups), file.name)
拥有有效的JSON后,您可以使用JSON模式验证程序验证它。 Python的明显选择是Python jsonschema
library。
答案 1 :(得分:3)
这不是有效的JSON。您不应该将单个子元素转换为JSON,然后将它们连接起来:您应该构建一个Python结构,然后将所有子元素转储到最后。
data = []
for key, value in self.small_groups.items():
data.append(value._asdict())
with io.open( file_dir + file_name, 'w', encoding='utf-8' ) as f:
f.write(json.dumps(data))