Dữ liệu JSON có khái niệm về các mảng và đối tượng rỗng và rỗng. Phần này giải thích cách mỗi khái niệm này được ánh xạ tới các khái niệm đối tượng dữ liệu là null và unset
giá trị null
JSON có một giá trị đặc biệt được gọi là null, giá trị này có thể được đặt trên bất kỳ loại dữ liệu nào bao gồm mảng, đối tượng, số và kiểu boolean
34 { Schema types
35 "id":null, [integer]
36 "firstName": null, [string]
37 "address": null, [Address complex type with maxOccurs = 1]
38 "homeAddresses":null [Address complex type with maxOccurs > 1]
39 "phoneNumbers": null [string with maxOccurs > 1]
40 }
Xem xét ví dụ trước trong đó dữ liệu JSON có giá trị null được phân tích cú pháp thành một đối tượng dữ liệu, điều sau đây là đúng
- id - Nếu thuộc tính được định nghĩa là không thể thực hiện được trong lược đồ, thì thuộc tính đó sẽ được đặt thành null. Nếu thuộc tính không được xác định là không thể thực hiện được, thì nó sẽ đưa ra một ngoại lệ
- firstName - Giá trị null được đặt trên thuộc tính
- địa chỉ - Nếu thuộc tính được định nghĩa là không thể thực hiện được trong lược đồ, thì thuộc tính đó sẽ được đặt thành null. Nếu thuộc tính không được xác định là không thể thực hiện được, thì nó sẽ đưa ra một ngoại lệ
- homeAddresses - Lược đồ không cho phép vô hiệu đối với thuộc tính này do đó nó sẽ không được đặt
- phoneNumbers - Thuộc tính này phải được xác định là không thể thực hiện được trong lược đồ nếu không nó sẽ đưa ra một ngoại lệ
Khi tuần tự hóa thành JSON, nếu một giá trị của thuộc tính trong đối tượng dữ liệu là null, thì nó sẽ được tuần tự hóa dưới dạng JSON null
Bỏ đặt thuộc tính
Không tồn tại thuộc tính từ dữ liệu JSON ánh xạ tới thuộc tính chưa đặt trong không gian đối tượng dữ liệu. Nếu thuộc tính trong đối tượng dữ liệu không được đặt [không đặt], thì thuộc tính sẽ không xuất hiện trong dữ liệu JSON
tài sản trống
Khái niệm rỗng JSON áp dụng cho mảng và đối tượng như hình bên dưới
41 {
42 "address":{}
43 "homeAddresses":[]
44 "phoneNumbers":[]
45 }
Trong trường hợp địa chỉ, một đối tượng dữ liệu địa chỉ trống được tạo. Đối tượng dữ liệu không có khái niệm về danh sách trống. Do đó, không có hành động nào được thực hiện trên đối tượng dữ liệu đối với hai thuộc tính đó
Không có NULL trong Python. Thay vào đó, nó không có. JSON có kiểu dữ liệu NULL, nhưng nó không có kiểu dữ liệu Không có. Một từ điển trong Python không thể có giá trị null nhưng có thể có “null” là giá trị có thể được hiểu là một chuỗiXử lý JSON NULL trong Python
Để xử lý JSON NULL trong Python, hãy sử dụng json. phương thức tải []. Phương thức loading[] trả về giá trị null tương đương với Python, là Không có
Để làm việc với dữ liệu json trong Python, hãy nhập thư viện json. Sau đó, xác định một đối tượng json bao gồm một giá trị null, mà chúng ta sẽ chuyển đổi thành Không có
import json data = '{ "name":"WandaVision", "service":null }' # parse the data dict = json.loads[data] print[dict]
đầu ra
{'name': 'WandaVision', 'service': None}
Và bạn nhận được giá trị Không, tương đương với null trong json
Đây là cách bạn có thể xử lý giá trị null của JSON trong Python
Đó là nó cho hướng dẫn này
Bài viết trước Cách chuyển đổi Python Set thành Tuple
Bài viết tiếp theo Python os. con đường. hàm isfile[] với ví dụ
kranal
https. //appdividend. com/
Krunal Lathiya là Kỹ sư phần mềm với hơn tám năm kinh nghiệm. Anh ấy đã phát triển một nền tảng vững chắc về các nguyên tắc khoa học máy tính và niềm đam mê giải quyết vấn đề. Ngoài ra, Krunal có kiến thức tuyệt vời về Khoa học dữ liệu và Học máy, đồng thời là chuyên gia về Ngôn ngữ Python. Krunal có kinh nghiệm với nhiều ngôn ngữ lập trình và công nghệ khác nhau, bao gồm PHP, R, Golang và JavaScript. Anh ấy cảm thấy thoải mái khi làm việc trong lĩnh vực phát triển front-end và back-end
Gần đây, tôi đang lướt qua nguồn cấp dữ liệu Twitter của mình để tìm các bài viết, thư viện mới về Go, v.v. và tôi tình cờ thấy một tweet có thông báo này
# Golang's JSON Unmarshalling là xấu
Tôi thậm chí không chắc làm thế nào nó tìm được đường vào nguồn cấp dữ liệu của tôi. Tôi không theo dõi người đã nói điều đó, vì vậy lý do duy nhất khiến nó xuất hiện trong nguồn cấp dữ liệu của tôi là thẻ bắt đầu bằng #
import json data = '{ "name":"WandaVision", "service":null }' # parse the data dict = json.loads[data] print[dict]4. Bất kể, điều này gây ấn tượng với tôi như một tiếng kêu cứu lớn. Trước đây, tôi đã viết về việc sử dụng JSON với Go trong loạt bài Advent của Học viện Gopher [xem https. //Blog. gopheracademy. com/advent-2016/advanced-encoding-decoding/] và cá nhân tôi chưa bao giờ thấy JSON được xử lý kém trong Go. Có lẽ không phải là ngôn ngữ dễ nhất trên thế giới, nhưng chắc chắn không phải là "tệ"
JSON có hai loại giá trị import json
data = '{ "name":"WandaVision", "service":null }'
# parse the data
dict = json.loads[data]
print[dict]
5
Sau khi liên hệ với tôi, tôi thấy rõ rằng vấn đề ở đây không phải dành riêng cho Go, mà là sự thiếu sót của JSON được sử dụng cùng với bất kỳ ngôn ngữ đánh máy nào. Trong JSON có hai loại
import json data = '{ "name":"WandaVision", "service":null }' # parse the data dict = json.loads[data] print[dict]5 hiệu quả
- Khi khóa được cung cấp và giá trị được nêu rõ ràng là
import json data = '{ "name":"WandaVision", "service":null }' # parse the data dict = json.loads[data] print[dict]
5 - Khi khóa không được cung cấp và giá trị ngầm định là
import json data = '{ "name":"WandaVision", "service":null }' # parse the data dict = json.loads[data] print[dict]
5
Thật không may [hay may mắn thay?], đó không phải là cách Go, hoặc bất kỳ ngôn ngữ đánh máy nào hoạt động. Chúng tôi không khai báo một cấu trúc [hoặc lớp] và mất một trường một cách kỳ diệu khi nó không được xác định. Trường đó sẽ luôn hiện diện và giá trị của trường đó sẽ là
import json data = '{ "name":"WandaVision", "service":null }' # parse the data dict = json.loads[data] print[dict]9 hoặc một giá trị hợp lệ
Ví dụ: hãy tưởng tượng chúng ta có một cấu trúc Blog và
{"title": "some new title"}
0 là một thuộc tính JSON tùy chọn, mã của bạn có thể trông như thế nàytype Blog struct {
ID int `json:"id"`
Title string `json:"title"`
Markdown string `json:"markdown"`
PublishedAt *int `json:"published_at"`
}
Điều này để lại cho chúng tôi hai tùy chọn cho
{"title": "some new title"}
0 - nó sẽ tham chiếu đến một số nguyên hoặc nó sẽ là số không. Chúng tôi không có bất kỳ cách nào để xác định xem đó là import json data = '{ "name":"WandaVision", "service":null }' # parse the data dict = json.loads[data] print[dict]9 là ẩn hay rõ ràng, chúng tôi chỉ biết liệu đó là con số không hay không
Tại sao chúng ta cần biết sự khác biệt giữa giá trị null ẩn và rõ ràng?
Hầu hết thời gian, sự khác biệt giữa khóa được đặt thành null và hoàn toàn không được đặt là không liên quan. Nếu giá trị đã xuất bản được đặt thành null trong thời gian
{"title": "some new title"}
3, chúng tôi có thể cho rằng bài đăng đó chưa được xuất bản và tiếp tụcTrường hợp điều này phát huy tác dụng là khi chúng tôi đang thực hiện cập nhật một phần. Ví dụ: nếu chúng tôi có API JSON và chúng tôi cho phép người dùng cập nhật bài đăng trên blog của họ thông qua yêu cầu
{"title": "some new title"}
4, thì người dùng API có thể gửi tải trọng JSON sau để cập nhật tiêu đề của bài đăng trên blog{"title": "some new title"}
Khi trường
{"title": "some new title"}
5 không được cung cấp, loại {"title": "some new title"}
6 của chúng tôi sẽ đặt trường thành null và chúng tôi có thể cho rằng điều này có nghĩa là người dùng không muốn cập nhật trường. Nhưng điều gì sẽ xảy ra khi người dùng muốn cập nhật trường này? Thật không may, mã của chúng tôi sẽ không biết sự khác biệt giữa việc đặt trường thành null một cách rõ ràng và không cung cấp khóa. Vậy làm thế nào để chúng tôi xử lý điều này trong Go?
Xác định xem khóa có được cung cấp hay không
Điều đầu tiên cần lưu ý là chúng ta có thể tùy chỉnh cách JSON được sắp xếp theo thứ tự cho bất kỳ loại nào bằng cách triển khai giao diện. Điều đó có nghĩa là chúng ta có thể thay thế trường
{"title": "some new title"}
0 của mình bằng một loại mới và viết mã của riêng mình để xử lý phân tích cú pháp JSONĐiều thứ hai cần nhớ là nếu trường của chúng ta là loại con trỏ [ví dụ:
{"title": "some new title"}
9], thì phương thức 41 {
42 "address":{}
43 "homeAddresses":[]
44 "phoneNumbers":[]
45 }
50 của nó sẽ không bao giờ được gọi nếu giá trị là import json data = '{ "name":"WandaVision", "service":null }' # parse the data dict = json.loads[data] print[dict]5 hoặc nếu khóa không bao giờ được cung cấp. Điều đó có nghĩa là chúng tôi cần đảm bảo rằng chúng tôi KHÔNG sử dụng con trỏ nếu chúng tôi cần xác định xem khóa đã được đặt chưa
Đặt hai mẩu tin đó lại với nhau, chúng ta có thể tạo một loại
41 {
42 "address":{}
43 "homeAddresses":[]
44 "phoneNumbers":[]
45 }
52 tùy chỉnh sẽ được sử dụng để xác định xem một giá trị đã được đặt hay chưa và giá trị đó có phải là null hay không41 {
42 "address":{}
43 "homeAddresses":[]
44 "phoneNumbers":[]
45 }
5Nếu chúng ta thay thế loại
41 {
42 "address":{}
43 "homeAddresses":[]
44 "phoneNumbers":[]
45 }
53 bằng loại 41 {
42 "address":{}
43 "homeAddresses":[]
44 "phoneNumbers":[]
45 }
52 [không phải con trỏ] thì phương thức 41 {
42 "address":{}
43 "homeAddresses":[]
44 "phoneNumbers":[]
45 }
50 sẽ được gọi bất cứ khi nào chúng ta phân tích cú pháp một số JSON thành đối tượng {"title": "some new title"}
6, cho chúng ta cơ hội xử lý phần sắp xếp lại đó bằng mã tùy chỉnh của mình. Cụ thể, chúng ta có thể đặt một vài cờ để xác định liệu khóa có được cung cấp hay khôngNếu bạn muốn xem điều này hoạt động như thế nào, chúng ta có thể kiểm tra nó bằng một vài chuỗi JSON bằng mã bên dưới hoặc bạn có thể chạy nó trên Go Playground
import json data = '{ "name":"WandaVision", "service":null }' # parse the data dict = json.loads[data] print[dict]2
Tóm tắt
Mặc dù có thể có các thiết kế API tốt hơn để tránh vấn đề này, nhưng nếu bạn gặp phải tình huống cần hỗ trợ cả hai loại
import json data = '{ "name":"WandaVision", "service":null }' # parse the data dict = json.loads[data] print[dict]5 cho khóa JSON, bạn có thể tận dụng kỹ thuật này để biến điều đó thành hiện thực. Chỉ cần thay thế trường
41 {
42 "address":{}
43 "homeAddresses":[]
44 "phoneNumbers":[]
45 }
58 bằng bất kỳ loại nào bạn cần hỗ trợ và bạn sẽ được đặtTìm hiểu phát triển web với Go
Đăng ký danh sách gửi thư của tôi và tôi sẽ gửi cho bạn một mẫu MIỄN PHÍ từ khóa học của tôi - Phát triển Web với Go. Mẫu bao gồm 19 đoạn ghi hình và một vài chương đầu tiên của cuốn sách
Bạn cũng sẽ nhận được email từ tôi về các kỹ thuật mã hóa Go, các khóa học sắp tới [bao gồm cả các khóa học MIỄN PHÍ] và giảm giá khóa học