2011-03-22 15 views

उत्तर

3

नहीं, यह PHP 5.5.1 के रूप में संभव नहीं है।

एकमात्र चीज संभव है कि json_decode StdClass ऑब्जेक्ट्स के बजाय वापसी सहयोगी सरणी हो।

0

जैसा कि गॉर्डन कहते हैं, संभव नहीं है। लेकिन यदि आप एक स्ट्रिंग प्राप्त करने के लिए एक तरीका ढूंढ रहे हैं जिसे किसी दिए गए वर्ग के उदाहरण के रूप में डीकोड किया जा सकता है तो आप serialize का उपयोग कर सकते हैं और इसके बजाय अनसुलझा कर सकते हैं।

class Foo 
{ 

    protected $bar = 'Hello World'; 

    function getBar() { 
     return $this->bar; 
    } 

} 

$string = serialize(new Foo); 

$foo = unserialize($string); 
echo $foo->getBar(); 
+0

यह प्रश्न का समाधान नहीं लगता है। यदि ऐसा होता है, तो आपको कुछ स्पष्टीकरण देना होगा। –

+0

मैंने बेहतर तरीके से मेरी बात समझाई: पी –

70

स्वचालित रूप से नहीं। लेकिन आप इसे पुराने तरीके से कर सकते हैं।

$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); 
+0

मुझे आपको यह सुझाव है कि यह नेस्टेड ऑब्जेक्ट्स (एसटीडी क्लास या परिवर्तित ऑब्जेक्ट के अलावा) के साथ काम नहीं करेगा – vivoconunxino

-1

JSON विभिन्न बीच डेटा स्थानांतरित करने के लिए एक सरल प्रोटोकॉल है प्रोग्रामिंग भाषाएं (और यह जावास्क्रिप्ट का एक सबसेट भी है) जो केवल कुछ प्रकारों का समर्थन करता है: संख्याएं, तार, सरणी/सूचियां, ऑब्जेक्ट्स/डिक्ट्स। ऑब्जेक्ट्स केवल कुंजी = वैल्यू मैप्स हैं और Arrays को ऑर्डर सूचियां दी जाती हैं।

इसलिए सामान्य वस्तुओं को सामान्य तरीके से व्यक्त करने का कोई तरीका नहीं है। समाधान एक संरचना को परिभाषित कर रहा है जहां आपके प्रोग्राम को पता चलेगा कि यह एक कस्टम ऑब्जेक्ट है।

{ "cls": "MyClass", fields: { "a": 123, "foo": "bar" } } 

यह MyClass का एक उदाहरण बना सकते हैं और 123 और "bar" के क्षेत्रों a और foo स्थापित करने के लिए इस्तेमाल किया जा सकता:

यहाँ एक उदाहरण है।

+4

यह सच हो सकता है, लेकिन सवाल प्रतिनिधित्व करने के बारे में नहीं पूछ रहा है वस्तुओं को एक सामान्य तरीके से। ऐसा लगता है कि उसे एक विशिष्ट JSON बैग मिला है जो एक या दोनों सिरों पर एक विशिष्ट वर्ग के लिए मानचित्र करता है। ऐसा कोई कारण नहीं है कि आप इस तरह से गैर-जेनेरिक नामित कक्षाओं के स्पष्ट क्रमबद्धीकरण के रूप में JSON का उपयोग नहीं कर सकते। यदि आप एक सामान्य समाधान चाहते हैं तो इसे नामकरण करना ठीक है, लेकिन जेएसओएन संरचना पर अनुबंध पर सहमत होने में कुछ भी गलत नहीं है। – DougW

20

आप इसे कर सकते हैं - यह एक क्लज है लेकिन पूरी तरह से संभव है। हमें तब करना पड़ा जब हमने सोफेबेस में चीजें संग्रहित करना शुरू किया।

$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 उन से अविश्वसनीय डेटा नहीं करते जोखिम।

+0

क्या यह encapsulated subclasses के साथ काम करता है। जैसे '' '{" ए ": {" बी ":" सी "}}' '', जहां 'ए' में ऑब्जेक्ट किसी अन्य वर्ग का है, न केवल एक सहयोगी सरणी है? –

+1

नहीं, json_decode उप ऑब्जेक्ट्स सहित stdclass ऑब्जेक्ट्स बनाता है, यदि आप उन्हें कुछ और करना चाहते हैं तो आपको उपरोक्त प्रत्येक ऑब्जेक्ट को क्लोज करना होगा। –

+0

धन्यवाद, मैंने कल्पना की है कि –

14

हमने JSON ऑब्जेक्ट्स को स्वचालित रूप से अपने स्वयं के मॉडल वर्गों पर मैप करने के लिए JsonMapper बनाया है। यह नेस्टेड/बाल वस्तुओं के साथ ठीक काम करता है।

<?php 
$mapper = new JsonMapper(); 
$contactObject = $mapper->map(
    json_decode(file_get_contents('http://example.org/contact.json')), 
    new Contact() 
); 
?> 
+0

आपकी महान पुस्तकालय के लिए कई thx। –

+0

वाह! यह सिर्फ अद्भुत है। – vothaison

5

आप जम्मू ohannes Schmitt's Serializer library इस्तेमाल कर सकते हैं:

यह केवल मानचित्रण के लिए docblock प्रकार की जानकारी है, जो सबसे वर्ग गुण वैसे भी है पर निर्भर करता है।

$serializer = JMS\Serializer\SerializerBuilder::create()->build(); 
$object = $serializer->deserialize($jsonData, 'MyNamespace\MyObject', 'json'); 
0

मैंने एक बार इस उद्देश्य के लिए एक सार आधार वर्ग बनाया है। चलिए इसे जेसन कन्वर्टिबल कहते हैं। इसे सार्वजनिक सदस्यों को क्रमबद्ध और 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(); 

बस स्मृति से, तो शायद दोषहीन नहीं। आपको स्थैतिक गुणों को भी बहिष्कृत करना होगा और जेसन से क्रमबद्ध होने पर व्युत्पन्न कक्षाओं को कुछ गुणों को अनदेखा करने का मौका दे सकता है। मुझे उम्मीद है कि आपको विचार मिल जाएगा, फिर भी।

0

.. आप नीचे दिए गए तरीके से यह कर सकते हैं

<?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

0

आप अपने वस्तु के लिए एक आवरण बनाने के लिए और आवरण की तरह लग रहे बना सकते हैं यह वस्तु ही है। और यह बहुस्तरीय वस्तुओं के साथ काम करेगा।

<?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 
संबंधित मुद्दे