2012-03-13 14 views
11

मैं json एन्कोडिंग के लिए ऑब्जेक्ट की श्रेणी परिवर्तित करना चाहते हैं की सरणी के साथ काम नहीं कर रहा है, मैं इसjson एनकोड वस्तुओं

$allVisits = $mapper->getAllVisits($year, $month); 
echo json_encode($allVisits); 

की तरह बनाने के लिए और यहाँ है getAllVisists विधि

function getAllVisits($year, $month) { 
    $where = array(
     'year = ?' => $year, 
     'month = ?' => $month 
    ); 
    $resultSet = $this->getDbTable()->fetchAll($where); 
    $visitsEntries = array(); 
    foreach ($resultSet as $row) { 

     $entry = new Visits_Model_Visit(); 
     $entry->setId($row->visit_id) 
       ->setDay($row->day) 
       ->setDate($row->date) 
       ->setTarget($row->target) 
       ->setStatus($row->visit_status) 
       ->setTime($row->visit_time); 

     $visitsEntries[] = $entry; 
    } 
    return $visitsEntries; 
} 

जब मैं गूंज है $ allVisits के आकार में यह रिकॉर्ड की सही संख्या वापसी, लेकिन में js मूल्यों इस तरह खाली प्राप्त कर रहे हैं [{}, {}, {}, {}]

संपादित

जब मैं print_r ($ allVisists) brfore यह एन्कोडिंग यह रिटर्न

Array 
(
    [0] => Visits_Model_Visit Object 
     (
      [day:private] => sunday 
      [date:private] => 2012-03-06 
      [target:private] => شسي 
      [id:private] => 1 
      [status:private] => 0 
      [time:private] => 12:00:00 
     ) 

    [1] => Visits_Model_Visit Object 
     (
      [day:private] => sunday 
      [date:private] => 2012-03-06 
      [target:private] => clinnics 
      [id:private] => 4 
      [status:private] => 0 
      [time:private] => 00:00:00 
     ) 

    [2] => Visits_Model_Visit Object 
     (
      [day:private] => Tuesday 
      [date:private] => 2012-03-06 
      [target:private] => clinnics 
      [id:private] => 5 
      [status:private] => 0 
      [time:private] => 00:00:00 
     ) 

    [3] => Visits_Model_Visit Object 
     (
      [day:private] => Wednesday 
      [date:private] => 2012-03-28 
      [target:private] => ??????? ??????? 
      [id:private] => 7 
      [status:private] => 0 
      [time:private] => 12:00:00 
     ) 

) 
+0

क्या आपने 'json_encode' को कॉल करने से पहले' print_r ($ allVisits) 'की कोशिश की है? – jerrymouse

+0

यह सरणी को ठीक से प्रिंट करता है – palAlaa

उत्तर

15

आप वस्तुओं भी सार्वजनिक सदस्यों की जरूरत नहीं है कि साथ json_encode उपयोग कर रहे हैं। json_encode केवल उन सदस्यों पर काम करता है जो इसे "देख सकते हैं", यही कारण है कि वे खाली हैं।

पीएचपी 5.4 के बाद से आप नियंत्रित करने के लिए जो डेटा json_encode के लिए की पेशकश की जाएगी JsonSerializable interface का उपयोग कर सकते, जैसे:

class Visits_Model_Visit implements JsonSerializable { 
    ... 
    public function jsonSerialize() { 
     return (object) get_object_vars($this); 
    } 
    ... 
} 

आप 5.4 से नीचे हैं, तो आप यह भी कहा कि समारोह को लागू कर सकते w/से विस्तार ओ इंटरफ़ेस और उसके बाद सही मान मैन्युअल रूप से असाइन करना:

$visitsEntries[] = $entry->jsonSerialize(); 

आशा है कि इससे मदद मिलती है।

+0

आप PHP के पुराने संस्करणों में जेसनसेरियलज़ेबल को कार्यान्वित कर सकते हैं यदि आप नीचे मेरे दृष्टिकोण का पालन करते हैं। – Westy92

5

गुण निजी या वस्तु के लिए संरक्षित कर रहे हैं? यदि ऐसा है, तो जेसन एन्कोड उन्हें ऑब्जेक्ट के अंदर नहीं देख सकता है। मैं अपने ऑब्जेक्ट्स में 'toJson' विधि बनाकर इसे प्राप्त करता हूं कि मुझे जेसन में क्रमबद्ध करने की आवश्यकता है। इस विधि में, मैं ऑब्जेक्ट गुणों को चलाता हूं और मैन्युअल रूप से जेनेरिक ऑब्जेक्ट का निर्माण करता हूं, जिसे मैं json_encode पर भेजता हूं। फिर मैं इस विधि से जेसन स्ट्रिंग वापस कर देता हूं।

अपने सभी ऑब्जेक्ट गुणों को सार्वजनिक न करें !!!!

+1

सहमत। आपको रे की अंतिम सलाह के साथ असहमत होना गलत होगा। 5.4 के लिए – Jake

4

जैसा कि रे कहते हैं कि यदि आपकी कक्षा की संपत्ति सुरक्षित या निजी हैं, तो इन्हें जेसन नहीं किया जाएगा।

PHP 5.4 के बाद से टिप्पणी करने के बजाय PHP 5.4 के बाद, आपके पास यह निर्दिष्ट करने की क्षमता है कि कौन सा डेटा JsonSerializable इंटरफ़ेस को कार्यान्वित करने के क्रमबद्ध किया जाएगा, इसलिए json_encode जानता है कि इस पर कैसे कार्य करें।

/* PHP >= 5.4 only */ 
class Visits_Model_Visit implement JsonSerializable { 
    public function jsonSerialize() 
    { 
     return array(
      'day' => $this->day, 
      'date' => $this->date, 
      'target' => $this->target, 
      'id' => $this->id, 
      'status' => $this->status, 
     ); 
    } 
} 
+0

याय। यह मेरे आंतरिक एपीआई के आधे दर्जन को साफ करेगा। फिंगर्स अपग्रेड पार कर गया है मेरे सर्वर को तोड़ नहीं है। – Jake

+0

@arraintxo मेरी कंपनी अभी php 5.3 में अपग्रेड कर रही है :(मुझे जेसनसेरियलज़ेबल इंटरफ़ेस नहीं मिला है। – Ray

+0

@ रे, मेरा समाधान आपको PHP के पुराने संस्करणों में जेसनएसरियलबल को लागू करने की अनुमति देता है। – Westy92

2

डिफ़ॉल्ट रूप से, json_encode() केवल किसी ऑब्जेक्ट के सार्वजनिक गुणों को क्रमबद्ध करता है। उन सभी गुणों को बनाना जिन्हें आप धारावाहिक सार्वजनिक करना चाहते हैं समाधान नहीं है! PHP 5.4 और बाद में JsonSerializable इंटरफ़ेस है, लेकिन मैं PHP के पुराने संस्करणों के लिए एक सीधा समाधान प्रस्तावित करता हूं।

चूंकि जेसनसेरियलज़ेबल केवल PHP 5.4 का हिस्सा है और बाद में, इसे स्वयं बनाएं।

if (!interface_exists('JsonSerializable')) { 
    interface JsonSerializable { 
     public function jsonSerialize(); 
    } 
} 

यह इतना कठिन नहीं था, है ना? अब हम जेसनएसरियलज़ेबल को कार्यान्वित किए बिना PHP के किस संस्करण का उपयोग कर रहे हैं, इस बारे में चिंता किए बिना लागू कर सकते हैं!

class Visits_Model_Visit implements JsonSerializable { 
    ... 
    // Only put properties here that you want serialized. 
    public function jsonSerialize() { 
     return Array(
      'day' => $this->day, 
      'date' => $this->date, 
      'target' => $this->target, 
      'id'  => $this->id, 
      'status' => $this->status, 
      'obj' => $this->obj->jsonSerialize(), // example for other objects 
      'time' => $this->time 
     ); 
    } 
    ... 
} 

अब तुम सिर्फ jsonSerialize() फोन एक साहचर्य सरणी है कि आप json_encode() साथ सांकेतिक शब्दों में बदलना कर सकते हैं पाने के लिए कर सकते हैं।

... 
    $entry = new Visits_Model_Visit(); 
    $entry->setId($row->visit_id) 
      ->setDay($row->day) 
      ->setDate($row->date) 
      ->setTarget($row->target) 
      ->setStatus($row->visit_status) 
      ->setTime($row->visit_time); 

    $visitsEntries[] = $entry->jsonSerialize(); 
    ... 

फिर आप अपना वांछित परिणाम प्राप्त करने के लिए json_encode($visitsEntries) पर कॉल कर सकते हैं।

json_encode(array(
    Protocol::PARAM_CODE => Protocol::CODE_SUCCESS, 
    Protocol::PARAM_USER => (object)$user->jsonSerialize() 
)); 

यहां तक ​​कि जब $ उपयोगकर्ता-> jsonSerialize() आउटपुट stdObject, json_encode तो है:

[ 
    { 
     "day":"sunday", 
     "date":"2012-03-06", 
     "target":"\u0634\u0633\u064a", 
     "id":1, 
     "status":0, 
     "time":"12:00:00" 
    }, 
    { 
     "day":"sunday", 
     "date":"2012-03-06", 
     "target":"clinnics", 
     "id":4, 
     "status":0, 
     "time":"00:00:00" 
    }, 
    ... 
] 
+0

क्यों सरणी है? मुझे ऑब्जेक्ट चाहिए - और प्रश्न "... ऑब्जेक्ट्स की सरणी" – Srneczek

+0

एक सहयोगी सरणी है क्योंकि जब आप उस पर json_encode() कहते हैं, तो यह उचित JSON नोटेशन में परिवर्तित हो जाएगा ऑब्जेक्ट। सरणी में कुंजी "ऑब्जेक्ट" संपत्ति नाम होंगी, और मान, गुणों के मान, ठीक होंगे, मैं अंतिम परिणाम के साथ अपना उत्तर अपडेट करूंगा। – Westy92

+0

मेरी टिप्पणी में अपडेट करें: json_encode() वास्तव में यह जांच नहीं करता है कि क्या आप सरणी या ऑब्जेक्ट में गुज़र रहे हैं, इसलिए आपको इसे आउटपुट में जो भी चाहिए, उसे स्पष्ट रूप से डालना होगा। इसलिए सरणी ठीक है, यह सिर्फ PHP है कि मैं समझदार होने की उम्मीद है तो यह वास्तव में है। – Srneczek

0

जो सरल उत्तर लिए देख रहे हैं उन, अन्य जटिल जवाब के विपरीत के लिए मेरी कला का टुकड़ा है गूंगा, यह नहीं है कि यह ऑब्जेक्ट है इसलिए आपको यह कहना होगा कि स्पष्ट रूप से इसे (ऑब्जेक्ट) पर कास्टिंग के साथ - क्या आप इसकी सादगी के लिए PHP से प्यार नहीं करते हैं?

+0

यह कैसे काम करता है? – user431806

+0

कैसे काम करता है? PHP में कास्टिंग? – Srneczek

+0

सं। प्रोटोकॉल :: कक्षा आप – user431806

संबंधित मुद्दे