क्या stdClass के अलावा किसी ऑब्जेक्ट में जेसन स्ट्रिंग को डीकोड करना संभव है?json_decode से कस्टम क्लास
उत्तर
नहीं, यह PHP 5.5.1 के रूप में संभव नहीं है।
एकमात्र चीज संभव है कि json_decode
StdClass ऑब्जेक्ट्स के बजाय वापसी सहयोगी सरणी हो।
जैसा कि गॉर्डन कहते हैं, संभव नहीं है। लेकिन यदि आप एक स्ट्रिंग प्राप्त करने के लिए एक तरीका ढूंढ रहे हैं जिसे किसी दिए गए वर्ग के उदाहरण के रूप में डीकोड किया जा सकता है तो आप serialize का उपयोग कर सकते हैं और इसके बजाय अनसुलझा कर सकते हैं।
class Foo
{
protected $bar = 'Hello World';
function getBar() {
return $this->bar;
}
}
$string = serialize(new Foo);
$foo = unserialize($string);
echo $foo->getBar();
स्वचालित रूप से नहीं। लेकिन आप इसे पुराने तरीके से कर सकते हैं।
$data = json_decode($json, true);
$class = new Whatever();
foreach ($data as $key => $value) $class->{$key} = $value;
या वैकल्पिक रूप से, आप पाएंगे कि अधिक स्वत: कर सकता है:
class Whatever {
public function set($data) {
foreach ($data AS $key => $value) $this->{$key} = $value;
}
}
$class = new Whatever();
$class->set($data);
संपादित: हो रही है एक छोटे से अधिक सजावटी:
class JSONObject {
public function __construct($json = false) {
if ($json) $this->set(json_decode($json, true));
}
public function set($data) {
foreach ($data AS $key => $value) {
if (is_array($value)) {
$sub = new JSONObject;
$sub->set($value);
$value = $sub;
}
$this->{$key} = $value;
}
}
}
// These next steps aren't necessary. I'm just prepping test data.
$data = array(
"this" => "that",
"what" => "who",
"how" => "dy",
"multi" => array(
"more" => "stuff"
)
);
$jsonString = json_encode($data);
// Here's the sweetness.
$class = new JSONObject($jsonString);
print_r($class);
मुझे आपको यह सुझाव है कि यह नेस्टेड ऑब्जेक्ट्स (एसटीडी क्लास या परिवर्तित ऑब्जेक्ट के अलावा) के साथ काम नहीं करेगा – vivoconunxino
JSON विभिन्न बीच डेटा स्थानांतरित करने के लिए एक सरल प्रोटोकॉल है प्रोग्रामिंग भाषाएं (और यह जावास्क्रिप्ट का एक सबसेट भी है) जो केवल कुछ प्रकारों का समर्थन करता है: संख्याएं, तार, सरणी/सूचियां, ऑब्जेक्ट्स/डिक्ट्स। ऑब्जेक्ट्स केवल कुंजी = वैल्यू मैप्स हैं और Arrays को ऑर्डर सूचियां दी जाती हैं।
इसलिए सामान्य वस्तुओं को सामान्य तरीके से व्यक्त करने का कोई तरीका नहीं है। समाधान एक संरचना को परिभाषित कर रहा है जहां आपके प्रोग्राम को पता चलेगा कि यह एक कस्टम ऑब्जेक्ट है।
{ "cls": "MyClass", fields: { "a": 123, "foo": "bar" } }
यह MyClass
का एक उदाहरण बना सकते हैं और 123
और "bar"
के क्षेत्रों a
और foo
स्थापित करने के लिए इस्तेमाल किया जा सकता:
यहाँ एक उदाहरण है।
यह सच हो सकता है, लेकिन सवाल प्रतिनिधित्व करने के बारे में नहीं पूछ रहा है वस्तुओं को एक सामान्य तरीके से। ऐसा लगता है कि उसे एक विशिष्ट JSON बैग मिला है जो एक या दोनों सिरों पर एक विशिष्ट वर्ग के लिए मानचित्र करता है। ऐसा कोई कारण नहीं है कि आप इस तरह से गैर-जेनेरिक नामित कक्षाओं के स्पष्ट क्रमबद्धीकरण के रूप में JSON का उपयोग नहीं कर सकते। यदि आप एक सामान्य समाधान चाहते हैं तो इसे नामकरण करना ठीक है, लेकिन जेएसओएन संरचना पर अनुबंध पर सहमत होने में कुछ भी गलत नहीं है। – DougW
आप इसे कर सकते हैं - यह एक क्लज है लेकिन पूरी तरह से संभव है। हमें तब करना पड़ा जब हमने सोफेबेस में चीजें संग्रहित करना शुरू किया।
$stdobj = json_decode($json_encoded_myClassInstance); //JSON to stdClass
$temp = serialize($stdobj); //stdClass to serialized
// अब हम में पहुंच सकते हैं और धारावाहिक वस्तु
$temp = preg_replace('@^O:8:"stdClass":@','O:7:"MyClass":',$temp);
// Unserialize के वर्ग बदल सकते हैं और चले कुछ भी नहीं की तरह इस तरह से था happend
$myClassInstance = unserialize($temp); // Presto a php Class
हमारे मानक में सभी वर्ग चर के माध्यम से पुन: प्रयास करने की कोशिश करने से तेज़।
चेतावनी: stdClass के अलावा अन्य नेस्टेड वस्तुओं के लिए काम नहीं करेंगे
संपादित करें: मन में डेटा स्रोत रखने के लिए, यह दृढ़ता से अनुशंसा की जाती है कि आप का एक बहुत ही carful विश्लेषण के बिना इस withe उन से अविश्वसनीय डेटा नहीं करते जोखिम।
क्या यह encapsulated subclasses के साथ काम करता है। जैसे '' '{" ए ": {" बी ":" सी "}}' '', जहां 'ए' में ऑब्जेक्ट किसी अन्य वर्ग का है, न केवल एक सहयोगी सरणी है? –
नहीं, json_decode उप ऑब्जेक्ट्स सहित stdclass ऑब्जेक्ट्स बनाता है, यदि आप उन्हें कुछ और करना चाहते हैं तो आपको उपरोक्त प्रत्येक ऑब्जेक्ट को क्लोज करना होगा। –
धन्यवाद, मैंने कल्पना की है कि –
हमने JSON ऑब्जेक्ट्स को स्वचालित रूप से अपने स्वयं के मॉडल वर्गों पर मैप करने के लिए JsonMapper बनाया है। यह नेस्टेड/बाल वस्तुओं के साथ ठीक काम करता है।
<?php
$mapper = new JsonMapper();
$contactObject = $mapper->map(
json_decode(file_get_contents('http://example.org/contact.json')),
new Contact()
);
?>
आपकी महान पुस्तकालय के लिए कई thx। –
वाह! यह सिर्फ अद्भुत है। – vothaison
आप जम्मू ohannes Schmitt's Serializer library इस्तेमाल कर सकते हैं:
यह केवल मानचित्रण के लिए docblock प्रकार की जानकारी है, जो सबसे वर्ग गुण वैसे भी है पर निर्भर करता है।
$serializer = JMS\Serializer\SerializerBuilder::create()->build();
$object = $serializer->deserialize($jsonData, 'MyNamespace\MyObject', 'json');
मैंने एक बार इस उद्देश्य के लिए एक सार आधार वर्ग बनाया है। चलिए इसे जेसन कन्वर्टिबल कहते हैं। इसे सार्वजनिक सदस्यों को क्रमबद्ध और deserialize करना चाहिए। यह प्रतिबिंब और देर से स्थिर बाध्यकारी का उपयोग कर संभव है।
abstract class JsonConvertible {
static function fromJson($json) {
$result = new static();
$objJson = json_decode($json);
$class = new \ReflectionClass($result);
$publicProps = $class->getProperties(\ReflectionProperty::IS_PUBLIC);
foreach ($publicProps as $prop) {
$propName = $prop->name;
if (isset($objJson->$propName) {
$prop->setValue($result, $objJson->$propName);
}
else {
$prop->setValue($result, null);
}
}
return $result;
}
function toJson() {
return json_encode($this);
}
}
class MyClass extends JsonConvertible {
public $name;
public $whatever;
}
$mine = MyClass::fromJson('{"name": "My Name", "whatever": "Whatever"}');
echo $mine->toJson();
बस स्मृति से, तो शायद दोषहीन नहीं। आपको स्थैतिक गुणों को भी बहिष्कृत करना होगा और जेसन से क्रमबद्ध होने पर व्युत्पन्न कक्षाओं को कुछ गुणों को अनदेखा करने का मौका दे सकता है। मुझे उम्मीद है कि आपको विचार मिल जाएगा, फिर भी।
.. आप नीचे दिए गए तरीके से यह कर सकते हैं
<?php
class CatalogProduct
{
public $product_id;
public $sku;
public $name;
public $set;
public $type;
public $category_ids;
public $website_ids;
function __construct(array $data)
{
foreach($data as $key => $val)
{
if(property_exists(__CLASS__,$key))
{
$this->$key = $val;
}
}
}
}
?>
अधिक जानकारी के लिए पर जाएँ create-custom-class-in-php-from-json-or-array
आप अपने वस्तु के लिए एक आवरण बनाने के लिए और आवरण की तरह लग रहे बना सकते हैं यह वस्तु ही है। और यह बहुस्तरीय वस्तुओं के साथ काम करेगा।
<?php
class Obj
{
public $slave;
public function __get($key) {
return property_exists ($this->slave , $key) ? $this->slave->{$key} : null;
}
public function __construct(stdClass $slave)
{
$this->slave = $slave;
}
}
$std = json_decode('{"s3":{"s2":{"s1":777}}}');
$o = new Obj($std);
echo $o->s3->s2->s1; // you will have 777
- 1. json_decode
- 2. json_decode ऑब्जेक्ट
- 3. कस्टम क्लास
- 4. कस्टम क्लास
- 5. json_decode GoDaddy होस्टिंग
- 6. PHP json_decode प्रश्न
- 7. कस्टम रिकॉर्ड क्लास
- 8. कॉलिंग में कस्टम क्लास
- 9. XSD.exe कस्टम क्लास नाम
- 10. कस्टम क्लास लोडर
- 11. कस्टम स्ट्रिंग क्लास
- 12. एंड्रॉइड - कस्टम ArrayAdapter क्लास
- 13. आयात कस्टम जावा क्लास
- 14. विशेष वर्णों के साथ Json_decode
- 15. कस्टम व्यू क्लास कैसे बढ़ाएं?
- 16. कस्टम उपयोगकर्ता नियंत्रण बेस क्लास
- 17. WinRT - MessageDialog.ShowAsync मेरी कस्टम क्लास
- 18. चींटी के माध्यम से जूनिट चलाना कस्टम क्लास धावक
- 19. UITableView डेटासोर्स और प्रतिनिधि कस्टम क्लास
- 20. क्यूटी QWebView क्लास कस्टम उपयोगकर्ता-एजेंट
- 21. कस्टम क्लास लोडिंग/ओवरराइडिंग एंड्रॉइड-नेटिव क्लासेस
- 22. क्लास लाइब्रेरी से HtmlEncode
- 23. जेएसओएन से जावा क्लास
- 24. नाम से इंस्टेंटियेट क्लास?
- 25. क्यों json_decode मेरे लिए काम नहीं करता है?
- 26. System.Net.Mail SMTP क्लास में कस्टम शीर्षलेख कैसे जोड़ें?
- 27. डब्ल्यूसीएफ सेवा जो कस्टम क्लास लौटाती है संदर्भ.cs
- 28. SaveInstanceState पर कस्टम क्लास का उदाहरण कैसे सहेजना है?
- 29. उद्देश्य-सी/आईफोन में एक कस्टम क्लास Serializable बनाओ?
- 30. जेएक्सबी, कस्टम बाइंडिंग्स, एडाप्टर 1.क्लास और जोडा-टाइम
यह प्रश्न का समाधान नहीं लगता है। यदि ऐसा होता है, तो आपको कुछ स्पष्टीकरण देना होगा। –
मैंने बेहतर तरीके से मेरी बात समझाई: पी –