Python - 将JSON输出格式化为文件

时间:2015-02-13 13:50:21

标签: python json

我有一个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格式,还是我必须使用逗号分隔对象?

另外,如果我在某个地方有一个模式,是否有办法验证输出?

2 个答案:

答案 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))