Python kiểm tra loại đối tượng json

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 tài liệu 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ở, Kẻ giả mạo, để tạo một số hồ sơ người dùng giả mạo 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 để bật kiểm tra loại nghiêm ngặt mà không cần 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.

Bản tóm tắt

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

Loại đối tượng JSON trong Python là gì?

Một đối tượng JSON thường được dùng làm định dạng lưu trữ hoặc giao tiếp giữa các quá trình. Đó là lý do tại sao trong Python, định dạng phẳng phổ quát được chấp nhận bởi write[]. đối tượng chuỗi .

Làm cách nào để kiểm tra khóa JSON có tồn tại hay không trong Python?

Kiểm tra xem khóa có tồn tại hay không trong JSON . Ghi chú. Chúng tôi đã sử dụng json. loading[] để chuyển đổi dữ liệu được mã hóa JSON thành từ điển Python. Sau khi chuyển dữ liệu JSON thành từ điển, chúng ta có thể kiểm tra xem khóa có tồn tại hay không .

Loại JSON là gì?

Loại dữ liệu hợp lệ . một số. một đối tượng [đối tượng JSON] một mảng. một boolean. a string. a number. an object [JSON object] an array. a boolean.

Chủ Đề