ใน Python มีวิธีการตรวจสอบว่าสตริงเป็น JSON ที่ถูกต้องก่อนที่จะพยายามแยกมันหรือไม่?
ตัวอย่างเช่นการทำงานกับสิ่งต่างๆเช่น Facebook Graph API บางครั้งก็ส่งคืน JSON บางครั้งอาจส่งคืนไฟล์รูปภาพ
ใน Python มีวิธีการตรวจสอบว่าสตริงเป็น JSON ที่ถูกต้องก่อนที่จะพยายามแยกมันหรือไม่?
ตัวอย่างเช่นการทำงานกับสิ่งต่างๆเช่น Facebook Graph API บางครั้งก็ส่งคืน JSON บางครั้งอาจส่งคืนไฟล์รูปภาพ
คำตอบ:
คุณสามารถลองทำjson.loads()
ซึ่งจะทำให้ValueError
ถ้าสตริงที่คุณส่งไม่สามารถถอดรหัสเป็น JSON
โดยทั่วไป " Pythonic " ปรัชญาสำหรับชนิดของสถานการณ์นี้เรียกว่าEAFPสำหรับง่ายต่อการขออนุญาตการให้อภัยกว่า
loads
ในข้อยกเว้น?
10
เป็นค่าหมายเลข JSON ที่ถูกต้อง
import json
def is_json(myjson):
try:
json_object = json.loads(myjson)
except ValueError as e:
return False
return True
สิ่งที่พิมพ์:
print is_json("{}") #prints True
print is_json("{asdf}") #prints False
print is_json('{ "age":100}') #prints True
print is_json("{'age':100 }") #prints False
print is_json("{\"age\":100 }") #prints True
print is_json('{"age":100 }') #prints True
print is_json('{"foo":[5,6.8],"foo":"bar"}') #prints True
แปลงสตริง JSON เป็นพจนานุกรม Python:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
แปลงวัตถุหลามเป็นสตริง JSON:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
หากคุณต้องการเข้าถึงการแยกวิเคราะห์ระดับต่ำอย่าม้วนไฟล์ของคุณเองให้ใช้ห้องสมุดที่มีอยู่: http://www.json.org/
สุดยอดการสอนเกี่ยวกับโมดูล JSON ของ python: https://pymotw.com/2/json/
sudo cpan JSON::XS
echo '{"foo":[5,6.8],"foo":"bar" bar}' > myjson.json
json_xs -t none < myjson.json
พิมพ์:
, or } expected while parsing object/hash, at character offset 28 (before "bar}
at /usr/local/bin/json_xs line 183, <STDIN> line 1.
json_xs
มีความสามารถในการตรวจสอบไวยากรณ์แยกวิเคราะห์ prittifying เข้ารหัสถอดรหัสและอื่น ๆ :
del json_object
ตรวจสอบครั้งเดียวหรือไม่?
try
ที่จะมีฟังก์ชั่นที่การตรวจสอบว่าการป้อนข้อมูลที่ถูกต้องโดยไม่ต้องใช้ #StopCanaryAbuse
ฉันจะบอกว่าการแยกวิเคราะห์เป็นวิธีเดียวที่คุณสามารถบอกได้อย่างแท้จริง ข้อยกเว้นจะถูกยกขึ้นโดยjson.loads()
ฟังก์ชั่นของไพ ธ อน(เกือบจะแน่นอน) หากไม่ใช่รูปแบบที่ถูกต้อง อย่างไรก็ตามวัตถุประสงค์ของตัวอย่างของคุณคุณสามารถตรวจสอบอักขระที่ไม่ใช่ช่องว่างคู่แรก ...
ฉันไม่คุ้นเคยกับ JSON ที่ facebook ส่งคืน แต่สตริง JSON ส่วนใหญ่จากเว็บแอปจะเริ่มต้นด้วยวงเล็บเหลี่ยมแบบเปิด[
หรือ{
วงเล็บปีกกา ไม่มีรูปแบบภาพที่ฉันรู้ว่าเริ่มต้นด้วยตัวอักษรเหล่านั้น
ในทางกลับกันถ้าคุณรู้ว่ารูปแบบไฟล์ใดที่อาจปรากฏขึ้นคุณสามารถตรวจสอบจุดเริ่มต้นของสตริงเพื่อหาลายเซ็นเพื่อระบุรูปภาพและสมมติว่าคุณมี JSON หากไม่ใช่รูปภาพ
การแฮ็กแบบง่าย ๆ เพื่อระบุกราฟิกแทนที่จะเป็นสตริงข้อความในกรณีที่คุณกำลังมองหากราฟิกเพียงเพื่อทดสอบอักขระที่ไม่ใช่ ASCII ในอักขระสองสามตัวแรกของสตริง (สมมติว่า JSON คือ ASCII )
ฉันคิดวิธีแก้ปัญหาทั่วไปที่น่าสนใจสำหรับปัญหานี้:
class SafeInvocator(object):
def __init__(self, module):
self._module = module
def _safe(self, func):
def inner(*args, **kwargs):
try:
return func(*args, **kwargs)
except:
return None
return inner
def __getattr__(self, item):
obj = getattr(self.module, item)
return self._safe(obj) if hasattr(obj, '__call__') else obj
และคุณสามารถใช้มันได้เช่น:
safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
# do something
except
ประโยคอาจซ่อนข้อยกเว้นที่ร้ายแรง การจับข้อยกเว้นจะต้องเข้มงวดเท่าที่จะทำได้