2012-03-25 26 views
32

मैं PHP में एक वेब अनुप्रयोग, मैं JSON स्ट्रिंग के रूप सर्वर से कई वस्तुओं स्थानांतरित करने की आवश्यकता के विकास कर रहा हूँ, वहाँ किसी भी पुस्तकालय के लिए मौजूदा है पीएचपी पहले से objec को JSON और JSON स्ट्रिंग के लिए वस्तु कन्वर्ट करने के लिए, जावा के लिए Gson पुस्तकालय की तरह ...JSON और JSON करने के लिए वस्तु परिवर्तित PHP में वस्तु के लिए, (जावा के लिए Gson तरह पुस्तकालय)

धन्यवाद ...

उत्तर

65

इस चाल करना चाहिए!

// convert object => json 
$json = json_encode($myObject); 

// convert json => object 
$obj = json_decode($json); 

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

$foo = new StdClass(); 
$foo->hello = "world"; 
$foo->bar = "baz"; 

$json = json_encode($foo); 
echo $json; 
//=> {"hello":"world","bar":"baz"} 

print_r(json_decode($json)); 
// stdClass Object 
// (
// [hello] => world 
// [bar] => baz 
//) 

है कि आप एक वस्तु के बजाय एक सरणी के रूप में उत्पादन, के बारे में भी json_encode()

देखें json_decode

print_r(json_decode($json, true)); 
// Array 
// (
// [hello] => world 
// [bar] => baz 
//)  

अधिक करने के लिए true पारित चाहते हैं : json_decode()

+2

एक समस्या मैं है अब के साथ काम कर रहा हूँ - json_decode() का उपयोग कर, मैं एक stdClass वस्तु मिलता है, मेरी मूल वस्तु नहीं। मैं धारावाहिक/unserialize का उपयोग कर सकते हैं, लेकिन मेरी वस्तुओं समय के साथ संरचना बदलती है भले ही थोड़ा, serialize serialize rendering। – Dennis

+1

@ डेनिस 'unserialize' हमेशा 'stdClass' का एक उदाहरण वापस कर देगा, यह इसे अनुपयोगी नहीं बनाता है। आप आसानी से '$ attrs = unserialize ($ json) जैसे कुछ का समर्थन करने के लिए आपको एपीआई डिज़ाइन कर सकते हैं; $ व्यक्ति = नया व्यक्ति ($ attrs); 'आपका 'व्यक्ति' कन्स्ट्रक्टर तदनुसार गुण असाइन कर सकता है। –

3
json_decode($json, true); 
// the second param being true will return associative array. This one is easy. 
12

बड़े पैमाने पर ऐप्स के लिए अधिक विस्तारशीलता के लिए encapsulated क्षेत्रों के साथ ओप शैली का उपयोग करें।

सरल तरीका: -

class Fruit implements JsonSerializable { 

     private $type = 'Apple', $lastEaten = null; 

     public function __construct() { 
      $this->lastEaten = new DateTime(); 
     } 

     public function jsonSerialize() { 
      return [ 
       'category' => $this->type, 
       'EatenTime' => $this->lastEaten->format(DateTime::ISO8601) 
      ]; 
     } 
    } 

गूंज json_encode (नए फल()); // आउटपुट जो:

{"category":"Apple","EatenTime":"2013-01-31T11:17:07-0500"} 

रियल Gson पीएचपी पर: -

  1. http://jmsyst.com/libs/serializer
  2. http://symfony.com/doc/current/components/serializer.html
  3. http://framework.zend.com/manual/current/en/modules/zend.serializer.html
  4. http://fractal.thephpleague.com/ - क्रमानुसार केवल
+0

फ़ंक्शन jsonSerialize के विपरीत कुछ भी कर रहा है .. –

+0

जेसन का उपयोग करने के साथ समस्या रिवर्स भाग है क्योंकि jeson_decode केवल stdClass ऑब्जेक्ट देता है। आपको फ़ील्डवेल की सरणी प्रदान करके अपनी कक्षा के किसी ऑब्जेक्ट को प्रारंभ करने में सक्षम होना चाहिए। रास्ता बहुत अधिक ओवरहेड। बस सादा serialize का उपयोग करें। – Hafenkranich

0

मैं एमए इसे हल करने के लिए एक विधि है। मेरा दृष्टिकोण है:

1 - एक सारणी वर्ग बनाएं जिसमें रेगेक्स का उपयोग करके ऑब्जेक्ट्स को ऐरे (निजी अटारी समेत) रूपांतरित करने का तरीका हो। 2 - लौटा सरणी को जेसन में कनवर्ट करें।

मैं अपने सभी डोमेन कक्षाओं के अभिभावक के रूप में इस सार वर्ग का उपयोग

कक्षा कोड:

namespace Project\core; 

abstract class AbstractEntity { 
    public function getAvoidedFields() { 
     return array(); 
    } 
    public function toArray() { 
     $temp = (array) $this; 

     $array = array(); 

     foreach ($temp as $k => $v) { 
      $k = preg_match ('/^\x00(?:.*?)\x00(.+)/', $k, $matches) ? $matches [1] : $k; 
      if (in_array ($k, $this->getAvoidedFields())) { 
       $array [$k] = ""; 
      } else { 

       // if it is an object recursive call 
       if (is_object ($v) && $v instanceof AbstractEntity) { 
        $array [$k] = $v->toArray(); 
       } 
       // if its an array pass por each item 
       if (is_array ($v)) { 

        foreach ($v as $key => $value) { 
         if (is_object ($value) && $value instanceof AbstractEntity) { 
          $arrayReturn [$key] = $value->toArray(); 
         } else { 
          $arrayReturn [$key] = $value; 
         } 
        } 
        $array [$k] = $arrayReturn; 
       } 
       // if it is not a array and a object return it 
       if (! is_object ($v) && !is_array ($v)) { 
        $array [$k] = $v; 
       } 
      } 
     } 

     return $array; 
    } 
} 
संबंधित मुद्दे