มีปัญหาสองข้อกับคำตอบที่ได้รับตัวอย่างเช่นหากมีรายการหนึ่งสตรีม JSON ที่ไม่ได้มาตรฐานดังกล่าว เพราะงั้นอาจต้องตีความสตริงขาเข้า (ไม่ใช่พจนานุกรม python)
ปัญหาที่ 1 - demjson
: ด้วย Python 3.7 + และการใช้ conda ฉันไม่สามารถติดตั้ง demjson ได้เนื่องจากในปัจจุบันไม่รองรับ Python> 3.5 ดังนั้นฉันต้องการวิธีแก้ปัญหาด้วยวิธีที่ง่ายกว่าเช่นast
และ / หรือjson.dumps
และ
ปัญหาที่ 2 - ast
& json.dumps
: หาก JSON เป็นทั้งที่ยกมาเดี่ยวและมีสตริงอย่างน้อยหนึ่งค่าซึ่งจะมีเครื่องหมายคำพูดเดี่ยววิธีแก้ปัญหาที่เรียบง่าย แต่ใช้งานได้จริงเพียงวิธีเดียวที่ฉันพบคือใช้ทั้งสองอย่าง:
ในตัวอย่างต่อไปนี้เราถือว่าline
เป็นวัตถุสตริง JSON ที่เข้ามา:
>>> line = str({'abc':'008565','name':'xyz','description':'can control TV\'s and more'})
ขั้นตอนที่ 1: แปลงสตริงขาเข้าเป็นพจนานุกรมโดยใช้ast.literal_eval()
ขั้นตอนที่ 2: นำjson.dumps
ไปใช้กับการแปลงคีย์และค่าที่เชื่อถือได้แต่ไม่ต้องแตะเนื้อหาของค่า :
>>> import ast
>>> import json
>>> print(json.dumps(ast.literal_eval(line)))
{"abc": "008565", "name": "xyz", "description": "can control TV's and more"}
json.dumps
เพียงอย่างเดียวจะไม่ทำงานเนื่องจากไม่ตีความ JSON แต่จะเห็นเฉพาะสตริง คล้ายกับast.literal_eval()
: แม้ว่าจะตีความ JSON (พจนานุกรม) อย่างถูกต้อง แต่ก็ไม่ได้แปลงสิ่งที่เราต้องการ