{"id":15346304,"url":"https://github.com/humbertzhang/jsoncensor","last_synced_at":"2025-04-15T04:12:05.996Z","repository":{"id":57438201,"uuid":"120621866","full_name":"Humbertzhang/jsoncensor","owner":"Humbertzhang","description":"Check json data in your python web service. ","archived":false,"fork":false,"pushed_at":"2018-11-09T03:39:21.000Z","size":16,"stargazers_count":6,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-15T04:12:00.040Z","etag":null,"topics":["aiohttp","flask","python","web","webservice"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Humbertzhang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-02-07T13:56:56.000Z","updated_at":"2019-04-12T13:22:32.000Z","dependencies_parsed_at":"2022-08-29T02:01:02.308Z","dependency_job_id":null,"html_url":"https://github.com/Humbertzhang/jsoncensor","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Humbertzhang%2Fjsoncensor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Humbertzhang%2Fjsoncensor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Humbertzhang%2Fjsoncensor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Humbertzhang%2Fjsoncensor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Humbertzhang","download_url":"https://codeload.github.com/Humbertzhang/jsoncensor/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249003955,"owners_count":21196793,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aiohttp","flask","python","web","webservice"],"created_at":"2024-10-01T11:20:58.046Z","updated_at":"2025-04-15T04:12:05.980Z","avatar_url":"https://github.com/Humbertzhang.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# jsoncensor\nCheck json data in your python web service.\n\u003cbr\u003e\n\n# 作用\n1,检查key数目是否一致 \u003cbr\u003e\n2,检查key是否一致 \u003cbr\u003e\n3,检查value的type是否一致, 若value为一个对象，则递归地检查它的key number，Key name, value type. \u003cbr\u003e\n\n# Usage\nSupport both python2.7 and python3 \u003cbr\u003e\n`pip install jsoncensor`\n创建一个标准json数据的字典，把它和待检查字典作为初始化JsonCensor对象的参数传入 \u003cbr\u003e\n调用JsonCensor对象的check方法. \u003cbr\u003e\n\n```Python\nfrom jsoncensor import JsonCensor\n\nstandard = {...}\nsuspect = {...}\n\njc = JsonCensor(standard, suspect)\nret = jc.check()\nif ret['statu'] == True:\n    print(\"ok\")\nelse:\n    print(ret)\n\n```\n\n返回结构体:\n\n```\n{\n    \"statu\": True Or False,\n    \"error\": string 若有错误为错误类型，否则为None,\n    \"error_indicator\": string 错误对象的字符串,\n    \"should_be\": string 错误对象应有的状态\n}\n```\n\n# 示例\n\n`plain_example`\n\n```Python\nfrom jsoncensor import JsonCensor\n\nstandard = {\n    \"k1\":\"v1\",\n    \"k2\":\"v2\",\n    \"k3\":[\"v3_1\", \"v3_2\", \"v3_3\"],\n    \"k4\":{\n        \"k4_1\":\"v4_1\",\n        \"k4_2\":\"v4_2\",\n        \"k4_3\":[\"v4_3_1\", \"v_4_3_2\"],\n        \"k4_4\":{\n            \"k_4_4_1\":\"v_4_4_1\"\n        }\n    },\n    \"k5\":{\n        \"k5_1\":{\n            \"k5_1_1\":{\n                \"k5_1_1_1\":{\n                    \"k5_1_1_1\":\"pass\"\n                }\n            }\n        }\n    }\n}\n\nperfect_suspect = {\n    \"k1\":\"test\",\n    \"k2\":\"test\",\n    \"k3\":[\"v3_1\", \"v3_2\", \"v3_3\"],\n    \"k4\":{\n        \"k4_1\":\"v4_1\",\n        \"k4_2\":\"v4_2\",\n        \"k4_3\":[\"v4_3_1\", \"v_4_3_2\", \"Helloooo\"],\n        \"k4_4\":{\n            \"k_4_4_1\":\"v_4_4_1\"\n        }\n    },\n    \"k5\":{\n        \"k5_1\":{\n            \"k5_1_1\":{\n                \"k5_1_1_1\":{\n                    \"k5_1_1_1\":\"test\"\n                }\n            }\n        }\n    }\n}\n\nkeynumber_suspect = {\n    \"k3\":[\"v3_1\", \"v3_2\", \"v3_3\"],\n    \"k4\":{\n        \"k4_1\":\"v4_1\",\n        \"k4_2\":\"v4_2\",\n        \"k4_3\":[\"v4_3_1\", \"v_4_3_2\", \"Helloooo\"],\n        \"k4_4\":{\n            \"k_4_4_1\":\"v_4_4_1\"\n        }\n    },\n    \"k5\":{\n        \"k5_1\":{\n            \"k5_1_1\":{\n                \"k5_1_1_1\":{\n                    \"k5_1_1_1\":\"test\"\n                }\n            }\n        }\n    }\n}\n\nkeyname_suspect = {\n    \"k1\":\"test\",\n    \"k2\":\"test\",\n    \"k3\":[\"v3_1\", \"v3_2\", \"v3_3\"],\n    \"k4\":{\n        \"k4_1\":\"v4_1\",\n        \"k4_2\":\"v4_2\",\n        \"k4_3\":[\"v4_3_1\", \"v_4_3_2\", \"Helloooo\"],\n        \"k4_4\":{\n            \"k_4_4_1\":\"v_4_4_1\"\n        }\n    },\n    \"k5\":{\n        \"k5_1\":{\n            \"k5_1_1\":{\n                \"fuckccnu\":{        #\u003c-Here\n                    \"k5_1_1_1\":\"test\"\n                }\n            }\n        }\n    }\n}\n\nvaltype_suspect = {\n    \"k1\":[\"test\"],      #\u003c- Difference Here\n    \"k2\":\"test\",\n    \"k3\":[\"v3_1\", \"v3_2\", \"v3_3\"],\n    \"k4\":{\n        \"k4_1\":\"v4_1\",\n        \"k4_2\":\"v4_2\",\n        \"k4_3\":[\"v4_3_1\", \"v_4_3_2\", \"Helloooo\"],\n        \"k4_4\":{\n            \"k_4_4_1\":\"v_4_4_1\"\n        }\n    },\n    \"k5\":{\n        \"k5_1\":{\n            \"k5_1_1\":{\n                \"k5_1_1_1\":{\n                    \"k5_1_1_1\":\"test\"\n                }\n            }\n        }\n    }\n}\n\njc1 = JsonCensor(standard, perfect_suspect)\nprint(jc1.check() == True)\nprint(jc1.check())\n\njc2 = JsonCensor(standard, keynumber_suspect)\nprint(jc2.check() == True)\nprint(jc2.check())\n\njc3 = JsonCensor(standard, keyname_suspect)\nprint(jc3.check() == True)\nprint(jc3.check())\n\njc4 = JsonCensor(standard, valtype_suspect)\nprint(jc4.check() == True)\nprint(jc4.check())\n```\npython3 plain_example.py 结果输出\n\n```\nTrue\n{'statu': True, 'error': None, 'error_indicator': None, 'should_be': None}\nFalse\n{'statu': False, 'error': 'KeyNumberError', 'error_indicator': 'k3, k4, k5', 'should_be': 'k1, k2, k3, k4, k5'}\nFalse\n{'statu': False, 'error': 'KeyNameError', 'error_indicator': 'fuckccnu', 'should_be': 'k5_1_1_1'}\nFalse\n{'statu': False, 'error': 'TypeError', 'error_indicator': \"['test']\", 'should_be': 'str'}\n```\n\n关于flask或aiohttp的例子请见example\n\n\n\n`https://www.cnblogs.com/sting2me/p/6550897.html`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhumbertzhang%2Fjsoncensor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhumbertzhang%2Fjsoncensor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhumbertzhang%2Fjsoncensor/lists"}