การแยกวิเคราะห์ JSON Python: คำแนะนำง่าย ๆ

การแยกวิเคราะห์ JSON Python: คำแนะนำง่าย ๆ

JSON (ย่อมาจาก 'JavaScript Object Notation') เป็นรูปแบบข้อความที่อำนวยความสะดวกในการแลกเปลี่ยนข้อมูลระหว่างแอปพลิเคชันที่หลากหลาย ตัวอย่างเช่น แอปพลิเคชัน เขียนด้วยภาษา C++ ที่ทำงานบน Windows สามารถแลกเปลี่ยนข้อมูล JSON กับแอปพลิเคชันที่เขียนด้วย python และทำงานบน Linux ได้อย่างง่ายดาย ความเรียบง่ายและความยืดหยุ่นได้นำไปสู่การใช้งานอย่างแพร่หลายในช่วงไม่กี่ปีที่ผ่านมา โดยเฉพาะอย่างยิ่งในรูปแบบ XML ก่อนหน้านี้





มีไลบรารีและชุดเครื่องมือสำหรับการแยกวิเคราะห์และสร้าง JSON จากภาษาและสภาพแวดล้อมเกือบทุกชนิด บทความนี้เน้นไปที่วิธีการและปัญหาที่เกิดจากการประมวลผล JSON โดยใช้ python





ตัวอย่าง JSON บางส่วน

เอนทิตี JSON ที่พบบ่อยที่สุดที่คุณจะพบคือ an วัตถุ : ชุดของการแมปคีย์-ค่าในรูปแบบที่แสดงด้านล่าง





วิธีรีเซ็ตรหัสผ่านบน ps4

คน.json:

{
'firstName': 'Alice',
'lastName': 'Hall',
'age': 35
}

นี่คือวิธีที่คุณสามารถแสดงอาร์เรย์ของวัตถุได้ ในการแสดงนี้ แต่ละรายการของอาร์เรย์เป็นอ็อบเจ็กต์ ต่อไปนี้เป็นตัวอย่างเงินเดือนของผู้เล่นเบสบอล



เงินเดือน.json:

[ {
'year' : 1985,
'teamId' : 'ATL',
'leagueId' : 'NL',
'playerId' : 'barkele01',
'salary' : 870000
}, {
'year' : 1985,
'teamId' : 'ATL',
'leagueId' : 'NL',
'playerId' : 'bedrost01',
'salary' : 550000
} ]

แน่นอน คุณสามารถแทนอาร์เรย์ของสเกลาร์ได้เช่นกัน ดูเหมือนว่านี้:





[
'hello',
'world',
35
]

แยก JSON ใน Python

Python ให้ json โมดูลที่สามารถใช้ในการแยกวิเคราะห์ JSON รวมทั้งสร้าง JSON จากวัตถุและรายการหลาม

ข้อมูลโค้ดต่อไปนี้แสดงวิธีเปิดไฟล์ JSON และโหลดข้อมูลลงในตัวแปร





import json
with open('sample.json', 'r') as fp:
obj = json.load(fp)

เมื่อคุณมีสตริงที่มีข้อมูล JSON คุณสามารถแปลงเป็นอ็อบเจ็กต์หลาม (หรือรายการ) ได้ดังนี้:

จะทำอย่างไรกับเซิร์ฟเวอร์
obj = json.loads('''{
'firstName': 'Alice',
'lastName': 'Hall',
'age': 35
}''')

หากต้องการแยกวิเคราะห์ JSON URL คุณสามารถสร้างวัตถุ URL โดยใช้ urllib2 และใช้ json.load() เหมือนก่อน.

import urllib2, json
url = urllib2.urlopen('http://site.com/sample.json')
obj = json.load(url)

การจัดการข้อผิดพลาด

เมื่อ JSON มีข้อผิดพลาด คุณจะได้รับ a ValueError . คุณสามารถจัดการและดำเนินการแก้ไขหากจำเป็น

try:
obj = json.loads('''{
'firstName': 'Alice',
'lastName: 'Hall',
'age': 35
}''')
except ValueError:
print('error loading JSON')

การแยก JSON จาก Command Line

บางครั้ง การแยกวิเคราะห์ JSON โดยใช้บรรทัดคำสั่ง python อาจเป็นประโยชน์ เพื่อตรวจสอบข้อผิดพลาดหรือเพื่อให้ได้ผลลัพธ์ที่มีการเยื้องอย่างดี

cat glossary.json
# prints
{'glossary': {'GlossDiv': {'GlossList': {'GlossEntry': {'GlossDef': {'GlossSeeAlso': ['GML', 'XML'], 'para': 'A meta-markup language, used to create markup languages such as DocBook.'}, 'GlossSee': 'markup', 'Acronym': 'SGML', 'GlossTerm': 'Standard Generalized Markup Language', 'Abbrev': 'ISO 8879:1986', 'SortAs': 'SGML', 'ID': 'SGML'}}, 'title': 'S'}, 'title': 'example glossary'}}

ในการรับเอาต์พุตเยื้องจากไฟล์ JSON ด้านบน คุณสามารถทำสิ่งต่อไปนี้:

python -mjson.tool glossary.json
# prints
{
'glossary': {
'GlossDiv': {
'GlossList': {
'GlossEntry': {
'Abbrev': 'ISO 8879:1986',
'Acronym': 'SGML',
'GlossDef': {
'GlossSeeAlso': [
'GML',
'XML'
],
'para': 'A meta-markup language, used to create markup languages such as DocBook.'
},
'GlossSee': 'markup',
'GlossTerm': 'Standard Generalized Markup Language',
'ID': 'SGML',
'SortAs': 'SGML'
}
},
'title': 'S'
},
'title': 'example glossary'
}
}

และนี่คือวิธีที่คุณสามารถโหลดวัตถุ JSON ลงใน python และแยกเฉพาะสิ่งที่คุณต้องการเท่านั้น

python -c 'import json; fp = open('glossary.json', 'r'); obj = json.load(fp); fp.close(); print(obj['glossary']['title']')
# prints
example glossary

การเข้าถึงข้อมูล

เมื่อคุณโหลดข้อมูล JSON ลงในตัวแปร python แล้ว คุณจะสามารถเข้าถึงข้อมูลได้เหมือนกับที่คุณทำกับ python dict ใดๆ (หรือแสดงรายการแล้วแต่กรณี) ตัวอย่างเช่น ข้อมูล JSON ด้านบนสามารถเข้าถึงได้ดังนี้:

firstName = obj['firstName']
lastName = obj['Hall']
age = obj['age']

ประเภทข้อมูล

ชนิดข้อมูลจะถูกกำหนดโดยอัตโนมัติจากข้อมูล สังเกตว่า อายุ ถูกแยกวิเคราะห์เป็นจำนวนเต็ม

print(type(obj['firstName']), type(obj['lastName']), type(obj['age']))
# prints

ตารางการแปลงต่อไปนี้ใช้เพื่อแปลงจาก JSON เป็น python

การแยกวิเคราะห์ JSON โดยใช้คลาสที่กำหนดเอง

โดยค่าเริ่มต้น ออบเจ็กต์ JSON is แยกเป็นหลาม dict . บางครั้ง คุณอาจจำเป็นต้องสร้างวัตถุของคลาสของคุณเองโดยอัตโนมัติจากข้อมูล JSON คุณสามารถทำได้โดยระบุ an object_hook ฟังก์ชั่นที่จัดการการแปลง ตัวอย่างต่อไปนี้แสดงให้เห็นว่า

นี่คือคลาสที่กำหนดเองซึ่งเป็นตัวแทนของa บุคคล .

class Person:
def __init__(self, firstName, lastName, age):
self.firstName = firstName
self.lastName = lastName
self.age = age
def __str__(self):
return '{{'firstName' = '{0}','lastName' = '{1}', 'age' = {2}}}'.format(self.firstName, self.lastName, self.age)

อินสแตนซ์ของคลาสนี้สร้างขึ้นโดยส่งผ่านอาร์กิวเมนต์ที่จำเป็นดังนี้:

person = Person('Crystal', 'Newell', 27)

ในการใช้คลาสนี้เพื่อสร้างอินสแตนซ์เมื่อแยกวิเคราะห์ JSON คุณต้องมี an object_hook ฟังก์ชั่นที่กำหนดดังนี้: ฟังก์ชันได้รับ python dict และส่งคืนวัตถุของคลาสที่ถูกต้อง

def obj_creator(d):
return Person(d['firstName'], d['lastName'], d['age'])

ตอนนี้คุณสามารถใช้สิ่งนี้ได้ object_hook ฟังก์ชันเมื่อเรียกใช้ตัวแยกวิเคราะห์ JSON

with open('sample.json', 'r') as fp:
obj = json.load(fp, object_hook = obj_creator)
print(obj)
# prints
{'firstName' = 'Alice','lastName' = 'Hall', 'age' = 35}

ตัวอย่างการใช้งาน JSON

JSON เป็นที่นิยมอย่างมากในปัจจุบัน เว็บไซต์และแอปพลิเคชัน SaaS (Software As A Service) หลายแห่งนำเสนอเอาต์พุต JSON ซึ่งแอปพลิเคชันสามารถใช้งานได้โดยตรง บางส่วนที่เปิดเผยต่อสาธารณะ ได้แก่ :

  • StackOverflow/StackExchange นี่คือ URL ซึ่งส่งคืนรายการคำถามในรูปแบบ JSON
  • GitHub เสนอ JSON api ที่ https://developer.github.com/v3/
  • และนี่คือ Flickr API: https://developer.yahoo.com/flickr/

หากคุณกำลังมองหาตัวอย่างเพิ่มเติมเกี่ยวกับวิธีการนำไปใช้ให้เกิดประโยชน์ โปรดดูคู่มือนี้เพื่อ การสร้างบอทโซเชียลมีเดียโดยใช้ Python .

ทำอย่างไรไม่ให้ ID ผู้โทร

คุณใช้ JSON เพื่อบริโภคหรือให้บริการหรือไม่ และคุณใช้ python ในเทคโนโลยีของคุณหรือไม่? อธิบายในความคิดเห็นด้านล่าง

แบ่งปัน แบ่งปัน ทวีต อีเมล การอัพเกรดเป็น Windows 11 คุ้มค่าหรือไม่?

Windows ได้รับการออกแบบใหม่ แต่นั่นเพียงพอที่จะโน้มน้าวให้คุณเปลี่ยนจาก Windows 10 เป็น Windows 11 หรือไม่

อ่านต่อไป
หัวข้อที่เกี่ยวข้อง
  • การเขียนโปรแกรม
  • การเขียนโปรแกรม
  • Python
เกี่ยวกับผู้เขียน เจ ศรีธา(เผยแพร่บทความ 17 บทความ) เพิ่มเติมจาก Jay Sridhar

สมัครรับจดหมายข่าวของเรา

เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!

คลิกที่นี่เพื่อสมัครสมาชิก