2012-05-07 11 views
6

पर PHP ऑब्जेक्ट-ग्राफ़ को सीरियलाइज़/अनैरियलाइज़ करें, मैं एक JSON स्ट्रिंग प्रस्तुति के लिए एक पूर्ण PHP ऑब्जेक्ट-ग्राफ़ को क्रमबद्ध करना चाहता था, और उसे एक समान PHP ऑब्जेक्ट-ग्राफ़ पर बेअसर करना चाहता था।जेएसओएन

विकल्प यहां मैं माना जाता का सार है, और कारण वे मेरे लिए काम नहीं करते:,

  • serialize() जो मैं चाहता भी नहीं करता है, क्योंकि यह एक प्रारूप पीएचपी के लिए विशिष्ट उपयोग करता है। मैं एक प्रारूप चाहता हूं जो व्यापक रूप से अधिकांश भाषाओं, और मानव-पठनीय/संपादन योग्य द्वारा समर्थित है।

  • json_encode() जो मैं चाहता हूं वह नहीं करता है, क्योंकि यह केवल सरल मूल्यों और सरणी करता है, वस्तुओं नहीं। (मैं वास्तव में मेरी कार्यान्वयन में इस का उपयोग कर रहा है, नीचे देखें।)

  • var_export() वृत्तीय संदर्भ संभाल नहीं करता है और जो मैं चाहता भी नहीं करता है (ऊपर देखें।) (ध्यान दें मेरे वर्तमान कार्यान्वयन नहीं है कि संभाल वृत्तीय संदर्भ या तो - टिप्पणियों को देखने और इस मुद्दे के स्पष्टीकरण के लिए नीचे दिए गए उत्तर)

  • सेबस्टियन बर्गमैन के Object Freezer एक अच्छा कार्यान्वयन है, लेकिन यह मैं क्या चाहते हैं नहीं करता है या तो -। यह एक बहुत लंबे प्रपत्र का उपयोग करता है, और GUIDs के साथ धारावाहिक वस्तुओं को भरने पर निर्भर करता है।

  • Serialized जो भी मैं चाहता हूं वह नहीं करता है - यह वास्तव में धारावाहिकता नहीं करता है, यह serialize() के आउटपुट को पार करता है और एक अलग प्रतिनिधित्व प्रस्तुत करता है, उदा। एक्सएमएल, लेकिन उस प्रतिनिधित्व को पार्स करने में असमर्थ है। (यह भी JSON का समर्थन नहीं करता - एक्सएमएल बहुत लंबे रूप है, और जो मैं चाहता नहीं है।)

मैं अब साझा करने के लिए एक काम कार्यान्वयन है:

https://github.com/mindplay-dk/jsonfreeze

JSON- , वृत्तीय संदर्भ की अनुमति नहीं है और न ही कई r -

{ 
    "#type": "Order", 
    "orderNo": 123, 
    "lines": [{ 
     "#type": "OrderLine", 
     "item": "milk \"fuzz\"", 
     "amount": 3, 
     "options": null 
    }, { 
     "#type": "OrderLine", 
     "item": "cookies", 
     "amount": 7, 
     "options": { 
      "#type": "#hash", 
      "flavor": "chocolate", 
      "weight": "1\/2 lb" 
     } 
    }], 
    "paid": true 
} 

यह दृष्टिकोण एक शुद्ध पेड़ संरचना कुल के लिए काम करने के लिए बनाया गया है: वस्तु ग्राफ का प्रतिनिधित्व इस तरह दिखता है एक ही वस्तुओं के लिए संदर्भ। दूसरे शब्दों में, यह सामान्य उद्देश्य नहीं है जैसे उदा। serialize() और unserialize() जो किसी भी PHP ऑब्जेक्ट-ग्राफ के लिए काम करता है।

मेरे initial approach में मैंने एक धारावाहिक रूप का उपयोग किया जो अनिवार्य रूप से वस्तुओं की आधार -0 सूची थी। सूची में पहला ऑब्जेक्ट (संख्या 0) धारावाहिक ऑब्जेक्ट-ग्राफ़ की जड़ है, किसी भी अन्य ऑब्जेक्ट को उनके क्रम में संग्रहीत किया जाता है।

वर्तमान कार्यान्वयन में, जेएसओएन प्रतिनिधित्व मूल वृक्ष-संरचना जैसा दिखता है, यह संभव है कि यह संभव है, जिससे जावास्क्रिप्ट में ऑब्जेक्ट-ग्राफ़ के जेएसओएन प्रस्तुति के साथ वास्तव में काम करना संभव हो। (JSON के रूप में जमा केवल विचलन जादू #type संपत्ति और #hash "प्रकार", (JSON ऑब्जेक्ट के रूप में जमा) नियमित array प्रकार सरणियों से array प्रकार हैश भेद करने के लिए इस्तेमाल किया (संपत्ति-नाम के साथ टकराव को रोकने के लिए # उपसर्ग के साथ) है सरणियों)।


मैं ऐतिहासिक उद्देश्यों के लिए यहां पिछले संस्करण के बारे में इन नोट्स को छोड़ रहा हूं।

सर्कुलर संदर्भों को प्रत्येक ऑब्जेक्ट के क्रमबद्ध प्रतिनिधित्व के अंदर नेस्टेड ऑब्जेक्ट्स को कभी भी संग्रहीत नहीं किया जाता है - इसके बजाय, किसी ऑब्जेक्ट-रेफरेंस को ऑब्जेक्ट-इंडेक्स के साथ JSON-ऑब्जेक्ट के रूप में संग्रहीत किया जाता है - उदा। {"__oref":2} ऑब्जेक्ट-सूची में इंडेक्स 2 के साथ ऑब्जेक्ट का संदर्भ है।

मुझे अपने कार्यान्वयन में सरणी-संदर्भों में समस्या है - जब मैं var_dump() कोड के अंदर जो सरणी के ऑब्जेक्ट्स के संदर्भों को पुनर्स्थापित करता है, तो उन्हें पॉप्युलेट किया जा रहा है, लेकिन किसी बिंदु पर सरणी की प्रतिलिपि बनाई जाती है, और आप खाली प्रति के साथ खत्म हो जाते हैं। मैंने कोड में हर जगह & वर्ण रखने की कोशिश की है, लेकिन जहां भी मैं संदर्भ द्वारा पास करता हूं, अंत परिणाम एक खाली सरणी है।

+0

मैं PHP स्वामित्व के क्रमबद्ध प्रारूप को कॉल नहीं करता क्योंकि यह दस्तावेज है - [कम से कम स्रोत-कोड के अंदर] (http://lxr.php.net/opengrok /xref/PHP_TRUNK/ext/standard/var.c#php_var_serialize_intern) - लेकिन साथ ही साथ तृतीय पक्ष भी। तो आप इसका इस्तेमाल कर सकते हैं। – hakre

+0

इसे दस्तावेज किया जा सकता है, लेकिन PHP एकमात्र प्लेटफ़ॉर्म/भाषा है जिसमें अनसुलझा() - का कार्यान्वयन है - मैं JSON को प्राथमिकता दूंगा जो पहले से ही प्रत्येक मुख्यधारा भाषा द्वारा समर्थित है। और मानव-पठनीय भी है। –

+0

आप धारावाहिक डेटा को एक्सएमएल में परिवर्तित कर सकते हैं जो हर जगह समर्थित है। [सीरियलाइज्ड लाइब्रेरी] (https://github.com/ktomk/Serialized) यह करता है। इसे जेसन डम्पर बीटीडब्ल्यू के साथ विस्तारित करना मुश्किल नहीं होना चाहिए। - तो शायद आप इसे उपयोगी पाते हैं। – hakre

उत्तर

2

समाप्त स्क्रिप्ट (ऊपर पोस्ट) मेरा सटीक आवश्यकताओं को पूरा:

  • को क्रमानुसार और एक पूरे कुल unserialize।

  • एक JSON प्रतिनिधित्व है जो मूल डेटा-संरचना जैसा दिखता है।

  • गतिशील रूप से जेनरेट की गई कुंजी या अन्य डेटा के साथ डेटा-संरचना को प्रदूषित न करें।

यह परिपत्र संदर्भों को संभाल नहीं करता है। जैसा कि comment above में बताया गया है, उसी वस्तु के परिपत्र संदर्भ या एकाधिक संदर्भों को संग्रहीत करने का कोई सही तरीका नहीं है, क्योंकि ये सभी बराबर हैं। इसे समझते हुए, मैंने फैसला किया कि मेरा ऑब्जेक्ट-ग्राफ़ एक नियमित पेड़ होना चाहिए, और इस सीमा को "अच्छी चीज़" के रूप में स्वीकार कर लिया।

अद्यतन: ouput अब खरोज, नई-पंक्तियों और सफेद स्थान के साथ प्रारूपित किया जा सकता है - यह महत्वपूर्ण था मुझे एक मानव पठनीय (और स्रोत नियंत्रण के अनुकूल) मेरी प्रयोजनों के लिए प्रतिनिधित्व करने के लिए। (स्वरूपण को आवश्यकतानुसार सक्षम या अक्षम किया जा सकता है।)

0

मुझे नहीं पता कि यह आपके बाद क्या है, लेकिन यदि आप केवल किसी ऑब्जेक्ट के सार्वजनिक गुणों में रुचि रखते हैं, तो get_object_vars ($ obj) चाल करेगा।

<?php 

class foo { 
    public $fname = "John"; 
    public $sname = "Doe"; 
    private $status = null; 
    static $type = "person"; 


} 

$obj = new foo; 

print_r((get_object_vars($obj))); 

print json_encode(get_object_vars($obj)); 

?> 

विल उत्पादन:

सरणी ([fname] => जॉन [SNAME] => डो)

{ "fname": "जॉन", "SNAME": "डो"}

उपर्युक्त विधि फ़ंक्शन संदर्भों और निजी चरों तक पहुंचने के लिए बेकार है लेकिन आप जो कुछ भी चाहते हैं उसे दस्तक देने के लिए आप इसे और अधिक कोड के साथ उपयोग करने में सक्षम हो सकते हैं।

दिनेश।

+0

यदि आपने पोस्ट किए गए कार्यान्वयन को देखा, तो मुझे उससे थोड़ा आगे मिला ... –