不管键如何,都替换JSON对象中所有出现的字符串

时间:2019-05-31 10:35:31

标签: python

我在Python中有一个JSON对象,它是通过.json()函数内置的请求创建的。

这是我正在做的事情的简化示例:

data = session.get(url)

obj = data.json()

s3object = s3.Object(s3_bucket, output_file)
s3object.put(Body=(bytes(json.dumps(obj).encode('UTF-8'))))

obj示例:

{'id': 'fab779b7-2586-4895-9f3b-c9518f34e028', 'project_id': 'a1a73e68-9943-4584-9d59-cc84a0d3e92b', 'created_at': '2017-10-23 02:57:03 -0700', 'sections': [{'section_name': '', 'items': [{'id': 'ffadc652-dd36-4b9f-817c-6539a4b462ab', 'created_at': '2017-10-23 03:36:13 -0700', 'updated_at': '2017-10-23 03:38:32 -0700', 'created_by': 'paul', 'question_text': 'Drawing Ref(s)', 'spec_ref': '', 'display_number': null, 'response': '', 'comment': 'see attached mh309', 'position': 1, 'is_conforming': 'N/A', 'display_type': 'text'}]}]}

在将JSON上传到S3之前,我需要在出现的任何位置用“不适用”替换任何出现的字符串“ N / A”,而不管其键或位置如何。我无法使用本地磁盘写入,因此这样做的原因是这样。

这可能吗?

我最初的计划是将其转换为字符串,然后在返回之前进行替换,这样效率低下吗?

谢谢

3 个答案:

答案 0 :(得分:1)

我想您粘贴到这里的对象必须是字典类型,您可以像检查“ type(json_object)是类字典”一样对其进行检查。假设您可以这样做:-

keys = json_object.keys()
for i in keys:
    if json_object[i]=="N/A":
        json_object[i]="Not Available"

希望有帮助!

答案 1 :(得分:1)

如评论中所述,obj是字典。无论位置如何,都用N/A替换Not Applicable的一种方法是将其转换为字符串,使用string.replace并将其转换回字典以进行进一步处理

import json

#Original dict with N/A
obj = {'id': 'fab779b7-2586-4895-9f3b-c9518f34e028', 'project_id': 'a1a73e68-9943-4584-9d59-cc84a0d3e92b', 'created_at': '2017-10-23 02:57:03 -0700', 'sections': [{'section_name': '', 'items': [{'id': 'ffadc652-dd36-4b9f-817c-6539a4b462ab', 'created_at': '2017-10-23 03:36:13 -0700', 'updated_at': '2017-10-23 03:38:32 -0700', 'created_by': 'paul', 'question_text': 'Drawing Ref(s)', 'spec_ref': '', 'display_number': None, 'response': '', 'comment': 'see attached mh309', 'position': 1, 'is_conforming': 'N/A', 'display_type': 'text'}]}]}

#Convert to string and replace
obj_str = json.dumps(obj).replace('N/A', 'Not Applicable')

#Get obj back with replacement
obj = json.loads(obj_str)

答案 2 :(得分:1)

尽管@Devesh Kumar Singh的答案适用于您问题中的示例json数据,将整个内容转换为字符串,然后批量批发替换子字符串似乎容易出错,因为可能会改变部分内容除了仅与字典键相关的值以外。

为避免这种情况,我建议使用以下代码,尽管需要花费几行代码,但它的选择性更高:

import json

def replace_NA(obj):

    def decode_dict(a_dict):
        for key, value in a_dict.items():
            try:
                a_dict[key] = value.replace('N/A', 'Not Applicable')
            except AttributeError:
                pass
        return a_dict

    return json.loads(json.dumps(obj), object_hook=decode_dict)


obj = {'id': 'fab779b7-2586-4895-9f3b-c9518f34e028', 'project_id': 'a1a73e68-9943-4584-9d59-cc84a0d3e92b', 'created_at': '2017-10-23 02:57:03 -0700', 'sections': [{'section_name': '', 'items': [{'id': 'ffadc652-dd36-4b9f-817c-6539a4b462ab', 'created_at': '2017-10-23 03:36:13 -0700', 'updated_at': '2017-10-23 03:38:32 -0700', 'created_by': 'paul', 'question_text': 'Drawing Ref(s)', 'spec_ref': '', 'display_number': None, 'response': '', 'comment': 'see attached mh309', 'position': 1, 'is_conforming': 'N/A', 'display_type': 'text'}]}]}
obj = replace_NA(obj)