Làm cách nào để kiểm tra Lược đồ JSON trong Python?

Một CLI lược đồ JSON và hook pre-commit được xây dựng trên jsonschema. Lược đồ có thể được chỉ định dưới dạng tệp cục bộ hoặc từ xa (HTTP hoặc HTTPS)

Các tệp từ xa được tự động tải xuống và lưu vào bộ đệm nếu có thể

Cách sử dụng

check-jsonschema có thể được cài đặt và chạy dưới dạng công cụ CLI hoặc thông qua cam kết trước

Ví dụ cấu hình pre-commit

Cấu hình sau đây sử dụng check-jsonschema để xác thực các tệp Github Workflow

Tài liệu

Tài liệu đầy đủ có thể được tìm thấy tại https. //kiểm tra-jsonschema. đọcthedocs. io/

Một CLI lược đồ JSON và hook pre-commit được xây dựng trên jsonschema. Lược đồ có thể được chỉ định dưới dạng tệp cục bộ hoặc từ xa (HTTP hoặc HTTPS)

Các tệp từ xa được tự động tải xuống và lưu vào bộ đệm nếu có thể

Cách sử dụng

check-jsonschema có thể được cài đặt và chạy dưới dạng công cụ CLI hoặc thông qua cam kết trước

Ví dụ cấu hình pre-commit

Cấu hình sau đây sử dụng check-jsonschema để xác thực các tệp Github Workflow

- repo: https://github.com/python-jsonschema/check-jsonschema
  rev: 0.21.0
  hooks:
    - id: check-github-workflows

Tài liệu

Tài liệu đầy đủ có thể được tìm thấy tại https. //kiểm tra-jsonschema. đọcthedocs. io/

là tính linh hoạt của cấu trúc tài liệu hoặc lược đồ. Đối với hầu hết các phần, tính linh hoạt trong lược đồ tài liệu là có lợi. Tuy nhiên, có thể có một số tình huống mà một số cấu trúc của tài liệu có thể hữu ích. Bài viết này chỉ cho bạn cách xác thực tài liệu JSON của bạn dựa trên một lược đồ cụ thể bằng cách sử dụng thư viện Python phổ biến pydantic.

Khi nào cần chứng thực tài liệu?

Một quan niệm sai lầm phổ biến về việc sử dụng cơ sở dữ liệu NoSQL là không yêu cầu cấu trúc hoặc lược đồ tài liệu. Trong hầu hết các trường hợp, các ứng dụng có xu hướng có một số ràng buộc đối với dữ liệu mặc dù chúng có thể không xác thực cụ thể dữ liệu đó. Ví dụ: có thể có một số trường trong tài liệu mà ứng dụng phụ thuộc vào chức năng. Một ứng dụng có thể không hoạt động chính xác khi thiếu một số trường này

Một ví dụ thực tế về sự cố này có thể là một ứng dụng đọc dữ liệu từ một ứng dụng không đáng tin cậy khác định kỳ gửi dữ liệu xấu. Sẽ là khôn ngoan nếu đánh dấu bất kỳ tài liệu nào có thể phá vỡ ứng dụng trong những trường hợp như vậy. Nhà phát triển có thể thực hiện việc này trong ứng dụng hoặc ở cấp tài liệu.

Theo cách tiếp cận này, chúng tôi chỉ định một lược đồ cho các tài liệu để giúp xác định những lược đồ không khớp với thông số kỹ thuật của ứng dụng ở cấp độ tài liệu

Tạo dữ liệu thử nghiệm JSON

Chúng tôi sử dụng thư viện nguồn mở, , để tạo một số hồ sơ người dùng giả cho hướng dẫn này.

Đây là cấu trúc của một tài liệu duy nhất

JavaScript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

{

  "công việc". "Kỹ thuật viên X-quang, chẩn đoán",

  "công ty". "Klein, Dillon và Neal",

  "nơi cư trú". "2232 Jackson Forks\nLake Teresa, CO 46959",

  "trang web". [

    "http. //giám mục-torres. mạng/"

  ],

  "tên người dùng". "aabbott",

  "tên". "Madison Mitchell",

  "địa chỉ". "1782 Căn hộ trên đồi Moore. 717\nTây Stephaniestad, NM 75293",

  "thư". "amberrodriguez@hotmail. com",

  "điện thoại". {

    "nhà". "677-197-4239x889",

    "di động". "001-594-038-9255x99138"

  }

}

Để mô phỏng các tài liệu bị hỏng, tôi sửa đổi một phần nhỏ hồ sơ người dùng bằng cách xóa một số trường điện thoại di động và thư. Chúng tôi mong muốn xác định những bản ghi này, trong thế giới thực, sẽ được lưu trữ trong cơ sở dữ liệu tài liệu như Couchbase

Tôi tải dữ liệu đã tạo vào một bộ chứa trên cụm Couchbase Capella được lưu trữ của chúng tôi bằng cách sử dụng nhập < . Tôi chỉ định trường functionality in the built-in web console UI for our testing. I specify the tên người dùng làm khóa để nhận dạng duy nhất từng tài liệu.

Làm cách nào để chỉ định lược đồ cho tài liệu JSON?

Trong dữ liệu hồ sơ người dùng, tôi mong đợi các tài liệu tuân theo cấu trúc sau trong các ứng dụng của mình

  • Các trường bắt buộc
    • tên tài khoản
    • Tên
    • điện thoại – với các phần tử JSON cho “nhà” & “di động”
    • thư
    • trang web – một mảng
  • trường tùy chọn
    • Công ty
    • nơi cư trú
    • Công việc
    • Địa chỉ

Pydantic là một trong những thư viện phổ biến nhất trong Python để xác thực dữ liệu. Cú pháp để chỉ định lược đồ tương tự như sử dụng gợi ý loại cho hàm trong Python. Các nhà phát triển có thể chỉ định lược đồ bằng cách xác định một mô hình. Nó có một bộ tính năng phong phú để thực hiện nhiều xác nhận khác nhau. Chúng ta sẽ xem qua phần trình bày cho một số thông số kỹ thuật của tài liệu hồ sơ người dùng.

Một điều cần lưu ý về pydantic là theo mặc định, nó cố gắng ép buộc các loại dữ liệu bằng cách thực hiện chuyển đổi loại khi có thể—ví dụ: chuyển đổi chuỗi '1' thành số 1. Tuy nhiên, có một tùy chọn để không thực hiện chuyển đổi.

Trong ví dụ mã này, bạn thấy một cấu hình cơ bản cho lược đồ UserProfile sử dụng cú pháp pydantic

con trăn

1

2

3

4

5

6

7

8

9

10

11

lớp Hồ sơ người dùng(Mô hình cơ sở):

    """Lược đồ cho hồ sơ người dùng"""

    tên người dùng. str

    tên. str

    điện thoại. Điện thoại

    thư. str

    công ty. Tùy chọn[str]

    nơi cư trú. Tùy chọn[str]

    trang web. Danh sách[HttpUrl]

    công việc. Tùy chọn[str]

    địa chỉ. Tùy chọn[str]

Mỗi trường được chỉ định cùng với loại dữ liệu dự kiến. Các trường tùy chọn được đánh dấu là Tùy chọn. Một mảng được chỉ định bởi Danh sách từ khóa theo sau là loại dữ liệu mong muốn.

Trường tên người dùng cần phải là một chuỗi, trong khi trường công ty field is an optional string. If we look at the other lines in the snippet, we see the trang web là danh sách loại HttpUrl – . one of the many custom types provided by pydantic out of the box. HttpUrl được sử dụng để xác thực rằng URL hợp lệ và không phải chuỗi ngẫu nhiên. Tương tự, có các trường khác như email mà chúng tôi có thể sử dụng để đảm bảo rằng các trường email là một biểu mẫu hợp lệ.

Nếu bạn nhìn vào trường điện thoại , thì trường này được đánh dấu là Điện thoại type which is a custom type that we will define in the next code snippet:

con trăn

1

2

3

4

5

6

7

8

9

10

11

lớp Điện thoại(Mô hình cơ sở):

   """Lược đồ cho số điện thoại"""

   nhà. str

   di động. str

 

   @trình xác thực("di động", "home")

   def does_not_contain_extension(cls, v):

       """Kiểm tra xem các số điện thoại có chứa tiện ích mở rộng không"""

       if "x" in v:

         tăng Lỗi tiện ích mở rộng(wrong_value=v)

       return v

Ở đây chúng tôi xác định rằng Điện thoại bao gồm hai trường, cả hai đều là chuỗi. nhà di động. Điều này sẽ được kiểm tra bên trong Hồ sơ người dùng mô hình và được hiểu là mô hình Hồ sơ người dùng . phone field that contains home and mobile fields. 

Pydantic cũng cho phép chúng tôi xác thực nội dung của dữ liệu cũng như loại và sự hiện diện của dữ liệu. Bạn có thể làm điều này bằng cách xác định các hàm xác thực các trường cụ thể. Trong ví dụ trên, chúng tôi xác thực các trường di động nhà để kiểm tra . Nếu chúng chứa tiện ích mở rộng, chúng tôi không hỗ trợ tiện ích đó và đưa ra lỗi tùy chỉnh. Những lỗi này sau đó được hiển thị cho người dùng thực hiện xác thực.

Bạn có thể xem định nghĩa lược đồ bằng cách chỉ định Mô hình. phương thức schema_json() như được hiển thị ở đây.

JavaScript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

{

  "tiêu đề". "Hồ sơ người dùng",

  "mô tả". "Lược đồ cho hồ sơ người dùng",

  "loại". "đối tượng",

  "thuộc tính". {

    "tên người dùng". {

      "tiêu đề". "Tên người dùng",

      "loại". "chuỗi"

    },

    "tên". {

      "tiêu đề". "Tên",

      "loại". "chuỗi"

    },

    "điện thoại". {

      "$ref". "#/definitions/Phone"

    },

    "thư". {

      "tiêu đề". "Thư",

      "loại". "chuỗi"

    },

    "công ty". {

      "tiêu đề". "Công ty",

      "loại". "chuỗi"

    },

    "nơi cư trú". {

      "tiêu đề". "Nơi cư trú",

      "loại". "chuỗi"

    },

    "trang web". {

      "tiêu đề". "Trang web",

      "loại". "mảng",

      "mặt hàng". {

        "loại". "chuỗi",

        "Độ dài tối thiểu". 1,

        "Độ dài tối đa". 2083,

        "định dạng". "uri"

      }

    },

    "công việc". {

      "tiêu đề". "Công việc",

      "loại". "chuỗi"

    },

    "địa chỉ". {

      "tiêu đề". "Địa chỉ",

      "loại". "chuỗi"

    }

  },

  "bắt buộc". [

    "tên người dùng",

    "tên",

    "điện thoại",

    "thư",

   "trang web"

  ],

  "định nghĩa". {

    "Điện thoại". {

      "tiêu đề". "Điện thoại",

      "mô tả". "Lược đồ cho số điện thoại",

      "loại". "đối tượng",

      "thuộc tính". {

        "nhà". {

          "tiêu đề". "Nhà",

          "type". "chuỗi"

        },

        "di động". {

          "tiêu đề". "Di động",

          "type". "chuỗi"

        }

      },

      "bắt buộc". [

        "nhà",

        "di động"

      ]

    }

  }

}

Xác thực các tài liệu JSON dựa trên lược đồ Python pydantic

Bây giờ chúng tôi đã xác định lược đồ, hãy khám phá cách chúng tôi có thể xác thực các tài liệu dựa trên lược đồ

Việc xác thực có thể được thực hiện bằng cách sử dụng phương pháp pydantic parse_obj của mô hình. Bạn chỉ định tài liệu là từ điển và kiểm tra các ngoại lệ xác thực. Trong trường hợp này, chúng tôi tìm nạp tất cả các tài liệu (tối đa đến giới hạn đã chỉ định) bằng cách sử dụng truy vấn Couchbase và kiểm tra từng tài liệu một và báo cáo bất kỳ lỗi nào.

con trăn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

password_authenticator = PasswordAuthenticator(DB_USER, DB_PWD)

    cụm = Cụm(

       CONN_STR,

       Tùy chọn cụm(password_authenticator),

   )

   validation_error_count = 0

   truy vấn = f"chọn hồ sơ. * từ `{BUCKET}`. {PHẠM VI}. {COLLECTION} hồ sơ GIỚI HẠN {DOCUMENT_LIMIT}"

   thử.

      kết quả = cụm. truy vấn(truy vấn)

      cho hàng trong kết quả:

         thử.

            Hồ sơ người dùng. parse_obj(hàng)

            validation_error_count += 1

         ngoại trừ Lỗi xác thực as e:

               in(f"Đã tìm thấy lỗi trong tài liệu. {row['username']}\n", e. json())

   ngoại trừ Ngoại lệ như e:

       in(e)

 

   in(f"Đếm lỗi xác thực. {validation_error_count}")

Lược đồ làm nổi bật một số lỗi được quan sát thấy trong tài liệu

JavaScript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Lỗi tìm thấy trong tài liệu. aarias

  [

   {

     "lộc". [

       "điện thoại",

       "nhà"

     ],

     "tin nhắn". "value là phần mở rộng, có \"(932)532-4001x319\"",

     "type". "value_error. tiện ích mở rộng",

     "ctx". {

       "wrong_value". "(932)532-4001x319"

     }

   },

   {

     "lộc". [

       "điện thoại",

       "di động"

     ],

     "tin nhắn". "trường bắt buộc",

     "type". "value_error. thiếu"

   }

]

Tài liệu có ID aarias có phần mở rộng trong trường chính và điện thoại mobile field is also missing.

Tóm lược

Ví dụ về hồ sơ người dùng này cho thấy cách chúng tôi có thể dễ dàng tạo các lược đồ tùy chỉnh cho tài liệu JSON của mình. Bài đăng này cũng cho thấy cách sử dụng các khả năng kiểm tra và xác thực của Python và mô-đun pydantic. Tuy nhiên, đây chỉ là phần nổi của tảng băng chìm–còn nhiều loại khác mà chúng tôi có thể xác thực.

Các cách tiếp cận khác cũng có thể thực hiện được; . Điều này có thể được thực hiện khá dễ dàng bằng cách tích hợp lược đồ mà chúng tôi đã xác định ở đây với ứng dụng và xác minh dữ liệu trước khi chèn/nâng cấp vào Couchbase

Làm cách nào để kiểm tra xem Lược đồ JSON có hợp lệ trong Python không?

Xác thực lược đồ JSON bằng Python .
Đầu tiên, cài đặt jsonschema bằng lệnh pip. pip cài đặt jsonschema
Xác định lược đồ. Mô tả loại JSON mà bạn mong đợi
Chuyển đổi JSON sang đối tượng Python bằng json. tải hoặc json. .
Truyền JSON kết quả cho phương thức xác thực () của một jsonschema

Làm cách nào để kiểm tra xem dữ liệu có phải là JSON Python không?

Bạn có thể thử làm json. loading() , sẽ đưa ra ValueError nếu chuỗi bạn chuyển qua không thể được giải mã dưới dạng JSON. Nói chung, triết lý "Pythonic" cho loại tình huống này được gọi là EAFP, nghĩa là Yêu cầu sự tha thứ dễ dàng hơn là sự cho phép

Làm cách nào để kiểm tra xem phản hồi có phải là JSON Python không?

json() – Yêu cầu Python. phản ứng. json() trả về một đối tượng JSON của kết quả (nếu kết quả được viết ở định dạng JSON, nếu không, nó sẽ phát sinh lỗi).

Python có thư viện JSON không?

Python đi kèm với gói tích hợp có tên là json để mã hóa và giải mã dữ liệu JSON.