कुछ पृष्ठभूमि पहले: मेरे पास कुछ सरल डेटा संरचनाएं हैं जो डिस्क पर जेसन फाइलों के रूप में जारी हैं। ये जेसन फाइलें विभिन्न भाषाओं और विभिन्न परिवेशों (जैसे वेब फ्रंटएंड और डेटा मैनिपुलेशन टूल्स) के अनुप्रयोगों के बीच साझा की जाती हैं।एक पायसन क्लास या स्ट्रक्चर में सुरक्षित रूप से एक जेसन पार्सिंग कर रहा है?
प्रत्येक फाइल के लिए मैं एक पायथन "पीओपीओ" (सादा पुराना पायथन ऑब्जेक्ट) बनाना चाहता हूं, और प्रत्येक आइटम के लिए एक संबंधित डेटा मैपर वर्ग को व्यवहार की तरह कुछ सरल सीआरयूडी लागू करना चाहिए (उदाहरण के लिए सहेजें कक्षा और स्टोर को क्रमबद्ध करेगा डिस्क पर जेसन फ़ाइल के रूप में)।
मुझे लगता है कि एक साधारण मैपर (जो केवल मूल प्रकारों के बारे में जानता है) काम करेगा। हालांकि, मैं सुरक्षा के बारे में चिंतित हूं। कुछ जेसन फाइलें वेब फ्रंटेंड द्वारा उत्पन्न की जाएंगी, इसलिए यदि कोई उपयोगकर्ता मुझे कुछ खराब जेसन खिलाता है तो एक संभावित सुरक्षा जोखिम।
class User(object):
def __init__(self, name, username):
self.name = name
self.username = username
import json
j = json.loads(your_json)
u = User(**j)
क्या संभावित सुरक्षा समस्याओं आप देख पा रहे हैं:
अंत में, यहाँ सरल मानचित्रण कोड (How to convert JSON data into a Python object पर उपलब्ध हैं) है?
एनबी: मैं पाइथन के लिए नया हूं।
संपादित करें: आपकी टिप्पणियों के लिए धन्यवाद। मुझे पता चला है कि मेरे पास एक जेसन है जहां मेरे पास 2 सरणी हैं, प्रत्येक में नक्शा है। दुर्भाग्यवश ऐसा लगता है कि जब मैं इनमें से अधिक प्राप्त करता हूं तो यह बोझिल हो जाता है।
मैं एक रिकॉर्ड टाइप में एक जेसन इनपुट मैप करने के लिए सवाल बढ़ा रहा हूं। मूल कोड यहां से है: https://stackoverflow.com/a/15882054/1708349। जब से मैं परिवर्तनशील वस्तुओं की जरूरत है, मैं इसे एक namedtuple के बजाय एक namedlist उपयोग करने के लिए बदल देंगे:
import json
from namedlist import namedlist
data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'
# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(data, object_hook=lambda d: namedlist('X', d.keys())(*d.values()))
print x.name, x.hometown.name, x.hometown.id
यह अभी भी सुरक्षित है?
एकमात्र समस्या जिसे मैं सोच सकता हूं वह यह है कि कुछ तोड़ जाएगा क्योंकि अमान्य डेटा लोड किया गया था। – poke
जेसन केवल सीमित प्रकार, int, bool, आदि को पार्स कर सकता है .. कुछ भी निष्पादित नहीं किया जाएगा, इसलिए मुझे कोई वास्तविक सुरक्षा जोखिम नहीं दिख रहा है –
मैं अभी भी वेब सेवा से इनपुट पर कुछ सैनिटी चेक करता हूं, खासकर यदि ये ऑब्जेक्ट्स हैं एक डेटाबेस हिट करने जा रहा है। हो सकता है कि कुछ नाम '100' से 100 प्रिंट करने योग्य पात्रों को सीमित करें और कुछ विराम चिह्न (जैसे अर्धविराम) की अनुमति न दें। इस पोस्ट को देखें http://stackoverflow.com/questions/421046/what-are-all-of-the-allowable-characters-for- लोग- नाम –