2009-11-11 11 views
6

मैं कुछ जेसन ऑब्जेक्ट्स को गठबंधन करने के लिए json_decode का उपयोग करने की कोशिश कर रहा हूं और फिर इसे फिर से एन्कोड करता हूं। मेरी json लगता है:PHP json_decode प्रश्न

{ 
    "core": { 
     "segment": [ 
      { 
       "id": 7, 
       "name": "test1" 
      }, 
      { 
       "id": 4, 
       "name": "test2" 
      } 
     ] 
    } 
} 

मैं इन json वस्तुओं के कुछ ही है और प्रत्येक कुछ इस तरह पाने के लिए केवल "segement" सरणियों गठबंधन करने के लिए करना चाहते हैं: में

{ 
    "segment": [ 
     { 
      "id": 7, 
      "name": "test1" 
     }, 
     { 
      "id": 4, 
      "name": "test2" 
     } 
    ], 
    "segment": [ 
     { 
      "id": 5, 
      "name": "test3" 
     }, 
     { 
      "id": 8, 
      "name": "test4" 
     } 
    ] 
} 

अभी मेरी PHP कोड, मैं जेसन को डीकोड कर रहा हूं, प्रत्येक "सेगमेंट" सरणी को स्ट्रिंग में संग्रहीत कर रहा हूं, और उसके बाद जेसन एन्कोड कर रहा हूं।

public function handleJSON($json){ 
     $decodeData = json_decode($json); 
     $segment =$decodeData->core; 
     return $segment; 
} 

public function formatJSON(){ 
     $segments = ""; 
    for ($i = 0; $i < count($json);$i++) 
     { 
      $segments .= handleJSON($json[$i]); 
     } 
    echo json_encode($segments); 
} 

जब मैं ऐसा करते हैं, मैं एक त्रुटि प्राप्त:

वर्ग stdClass की वस्तु स्ट्रिंग के लिए कनवर्ट नहीं किया जा सकता है तो फिर मैं उन्हें एक सरणी में भंडारण के उपयोग करने की कोशिश:

public function formatJSON(){ 
     $segments = array(); 
    for ($i = 0; $i < count($json);$i++) 
     { 
      $segments[$i] = handleJSON($json[$i]); 
     } 
    echo json_encode($segments); 
} 

इस बार, मुझे कोई त्रुटि नहीं मिली है, लेकिन यह मेरी संपूर्ण संयुक्त जेसन ऑब्जेक्ट को सरणी ब्रैकेट में संग्रहीत करता है। मैं सरणी में encapsulated किए बिना, JSON ऑब्जेक्ट को वापस कैसे कर सकता हूं?

उत्तर

14

मुझे लगता है कि एक दृष्टिकोण json_decode को दूसरा पैरामीटर का लाभ लेने के लिए होगा, assoc:

"। सही, लौटे वस्तुओं साहचर्य सरणियों में बदल दिया जाएगा जब"

मुझे लगता है कि आमतौर पर stdClass कक्षा के बजाय सहयोगी सरणी से निपटना आसान होता है।

$str = '{ 
    "core": { 
     "segment": [ 
      { 
       "id": 7, 
       "name": "test1" 
      }, 
      { 
       "id": 4, 
       "name": "test2" 
      } 
     ] 
    } 
}'; 
print "<pre>"; 
print_r(json_decode($str)); 
print "</pre>"; 
print "<pre>"; 
print_r(json_decode($str,true)); 
print "</pre>"; 

यह पहली पैदा करता वस्तु संस्करण, तो साहचर्य सरणी:

stdClass Object 
(
    [core] => stdClass Object 
     (
      [segment] => Array 
       (
        [0] => stdClass Object 
         (
          [id] => 7 
          [name] => test1 
         ) 

        [1] => stdClass Object 
         (
          [id] => 4 
          [name] => test2 
         ) 

       ) 

     ) 

) 
Array 
(
    [core] => Array 
     (
      [segment] => Array 
       (
        [0] => Array 
         (
          [id] => 7 
          [name] => test1 
         ) 

        [1] => Array 
         (
          [id] => 4 
          [name] => test2 
         ) 

       ) 

     ) 

) 

मुझे लगता है कि मैं कुछ की तरह करना होगा, नए खाली सरणी बनाने के लिए, के रूप में साहचर्य सरणी को डिकोड, खंड सदस्यों को बाहर खींचने और उन्हें नए खाली सरणी में विभाजित करें। तो:

$segments = array(); 
// assuming you had a bunch of items in the $strings array 
foreach ($strings as $str) { 
    $item = json_decode($str,true); 
    $segments = array_merge($item['core']['segment], $segments); 
} 

अब, आप इस तरह JSON को यह सांकेतिक शब्दों में बदलना कर सकते हैं:

$final_json = json_encode(array('segments'=>$segments)); 
+1

धन्यवाद! यह बहुत हास्यास्पद था! – dtrainer45

+0

खुशी है कि यह सहायक था! – artlung

2

आपके बाहरी ऑब्जेक्ट में "सेगमेंट" नामक दो आइटम हैं। हालांकि यह कानूनी JSON है, एक ही नाम के साथ दो अलग-अलग वस्तुओं के साथ PHP ऑब्जेक्ट होना संभव नहीं है।

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