【问题标题】:Validate JSON data using python使用 python 验证 JSON 数据
【发布时间】:2019-06-26 17:15:03
【问题描述】:

我需要创建一个函数来验证传入的 json 数据并返回一个 python dict。它应该检查 json 文件中是否存在所有必要的字段,并验证这些字段的数据类型。我需要使用try-catch。您能否提供一些可以给我答案的 sn-ps 或示例?

【问题讨论】:

    标签: python json python-3.x validation


    【解决方案1】:

    当您使用 JSON 文件时,您可以使用以下示例:

    import json
    def validate(filename):
        with open(filename) as file:
            try:
                return json.load(file) # put JSON-data to a variable
            except json.decoder.JSONDecodeError:
                print("Invalid JSON") # in case json is invalid
            else:
                print("Valid JSON") # in case json is valid
    

    【讨论】:

    • 'JSONDecodeError' 未定义并会产生错误!正确的名称是 'json.decoder.JSONDecodeError' !
    • @Apostolos 抱歉,看来我出于某种原因犯了这个错误。已编辑,因此对于未来的观众来说答案是正确的。虽然,我的答案不是真正回答原始问题的答案
    • @ATernative ,问题是关于检查是否存在必要的字段,而不是某些字符串能够被解析为 JSON。
    【解决方案2】:

    如果您还没有检查jsonschema 库,则验证数据可能很有用。 JSON Schema 是描述 JSON 内容的一种方式。该库仅使用该格式根据给定的架构进行验证。

    我从基本用法做了一个简单的例子。

    import json
    from jsonschema import validate
    
    # Describe what kind of json you expect.
    schema = {
        "type" : "object",
        "properties" : {
            "description" : {"type" : "string"},
            "status" : {"type" : "boolean"},
            "value_a" : {"type" : "number"},
            "value_b" : {"type" : "number"},
        },
    }
    
    # Convert json to python object.
    my_json = json.loads('{"description": "Hello world!", "status": true, "value_a": 1, "value_b": 3.14}')
    
    # Validate will raise exception if given json is not
    # what is described in schema.
    validate(instance=my_json, schema=schema)
    
    # print for debug
    print(my_json)
    

    【讨论】:

      【解决方案3】:

      我也遇到了同样的问题,对现有的使用 jsonschema 的解决方案不满意。它给出了糟糕的错误消息,根本不是用户友好的。

      我编写了自己的库来定义模式,它比 jsonschema 多了很多附加功能:

      https://github.com/FlorianDietz/syntaxTrees

      它提供非常精确的错误消息,允许您编写代码来自定义验证过程,允许您定义对经过验证的 JSON 进行操作的函数,甚至为您定义的模式创建 HTML 文档。

      Schema 被定义为类,类似于 Django 定义模型的方式:

      class MyExampleNode(syntaxTreesBasics.Node):
          field_1 = fields.Float(default=0)
          field_2 = fields.String()
          field_3 = fields.Value('my_example_node', null=True, default=None)
          class Meta:
              name = 'my_example_node'
      

      【讨论】:

        【解决方案4】:

        jsonschema 和语法树只是为了找到基本的语法错误而过度杀伤力,而 try/except 解决方案没有提供关于何处的提示。这个小改进提供了您发现问题所需的错误消息:

        import json
        def validate(filename):
            with open(filename) as file:
                try:
                    return json.load(file) # put JSON-data to a variable
                except json.decoder.JSONDecodeError as err:
                    print(f"Invalid JSON: {err}") # in case json is invalid
                else:
                    print("Valid JSON") # in case json is valid
        

        例如,文件中有这个:

        {"a": 123, 'b': 456}
        

        它将提供:

        invalid JSON: Expecting property name enclosed in double quotes: line 1 column 12 (char 11)
        

        这是用户无需创建完整架构的开销即可定位问题所需的那种提示。

        【讨论】:

          【解决方案5】:

          虽然 Jsonschema 模块很好,但文档缺少复杂的示例。并且库没有报告任何无效架构的错误,只是忽略!

          这是一个例子:

          from jsonschema import validate
          
          set_tl_schema = {
              "type" : "object",
              "properties" :  {
          
              "level": {
                "value": {"type" : "number"},
                "updatedAt": {"type" : "number"}
              }
          }
          }
          
          x = {'level': {'updatedAt': '1970-01-01T00:00:00.000Z', 'value': 1}, }
          
          try:
              validate(instance=x, schema=set_tl_schema)
          except jsonschema.exceptions.ValidationError as ex:
              print(ex)
          

          错误是该级别还需要属性字段。但验证者从不向您报告。

          我发现模块非常高效且易于使用:

          https://pypi.org/project/json-checker/

          >>> from json_checker import Checker
          
          >>> current_data = {'first_key': 1, 'second_key': '2'}
          >>> expected_schema = {'first_key': int, 'second_key': str}
          
          
          >>> checker = Checker(expected_schema)
          >>> result = checker.validate(current_data)
          

          【讨论】:

            猜你喜欢
            • 2010-11-15
            • 2018-08-18
            • 2015-01-31
            • 1970-01-01
            • 1970-01-01
            • 2012-02-17
            • 2018-02-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多