सरणी के रूप में टाइप stdClass की वस्तु का उपयोग नहीं कर सकते?


541

मुझे उपयोग करने में एक अजीब त्रुटि मिलती है json_decode()। यह डेटा को सही ढंग से डिकोड करता है (मैंने इसका उपयोग करते हुए देखा print_r), लेकिन जब मुझे मेरे द्वारा प्राप्त सरणी के अंदर जानकारी तक पहुंचने का प्रयास किया जाता है:

Fatal error: Cannot use object of type stdClass as array in
C:\Users\Dail\software\abs.php on line 108

मैंने केवल यह करने की कोशिश की: डेटा $result['context']कहां $resultसे लौटा हैjson_decode()

मैं इस सरणी के अंदर मान कैसे पढ़ सकता हूं?


15
$ परिणाम = json_decode ('स्ट्रिंग', सत्य); सच्चा रिटर्न जोड़ने का परिणाम एक सरणी के रूप में होता है न कि stdClass के रूप में।
नेपालज

जवाबों:


788

json_decodeसरणी वापस करने के लिए दूसरे पैरामीटर का उपयोग करें :

$result = json_decode($data, true);

209

फ़ंक्शन json_decode()डिफ़ॉल्ट रूप से ऑब्जेक्ट देता है।

आप इस तरह से डेटा तक पहुँच सकते हैं:

var_dump($result->context);

यदि आपके पास पहचानकर्ता है from-date(उपरोक्त विधि का उपयोग करते समय हाइफ़न एक PHP त्रुटि का कारण होगा) तो आपको लिखना होगा:

var_dump($result->{'from-date'});

यदि आप एक सरणी चाहते हैं तो आप कुछ इस तरह से कर सकते हैं:

$result = json_decode($json, true);

या ऑब्जेक्ट को किसी सरणी में डालें:

$result = (array) json_decode($json);

2
इसे खोजने में मुझे कुछ समय लगा जब php में _destroy मान को संदर्भित करने का एक तरीका खोजने की कोशिश की जा रही है, जो नॉकआउट द्वारा निर्धारित किया गया है, इसलिए +1
deltree

2
यह उत्तर पहले (सबसे रेटेड) उत्तर की तुलना में बहुत अधिक योग्य है!
मोजतबा रेज़ियन

149

->किसी ऑब्जेक्ट के उपयोग से आपको इसे एक्सेस करना होगा ।

अपना कोड इससे बदलें:

$result['context'];

सेवा:

$result->context;

मेरे पास जो समस्या है वह एक सशर्त में संपत्ति का उपयोग करने की कोशिश कर रहा है। if ($result->context = $var) इससे संपत्ति को var पर सेट किया जा सकता है और यह सही है, कोई फर्क नहीं पड़ता।
STWilson

3
@STWillson आपको एक डबल बराबर का उपयोग करना चाहिए ==, आपकी वर्तमान स्थिति में आप एक समान का उपयोग करके $varमूल्य प्रदान कर रहे हैं । और इसे पढ़ेगा जैसे कि यह खाली है या नहीं, और यदि इसका मूल्य है तो इसका मतलब है कि यह खाली नहीं है और हमेशा सही रहेगा। $result->context=if statement$var
जिनेक्सस

89

आज एक ही समस्या है, इस तरह से हल:

यदि आप कॉल json_decode($somestring)करते हैं तो आपको एक ऑब्जेक्ट मिलेगा और आपको एक्सेस करने की आवश्यकता होगी $object->key, लेकिन यदि आप कॉल करते हैं json_decode($somestring, true)तो आपको एक डिक्शनरी मिलेगी और जैसे एक्सेस कर सकते हैं$array['key']


2
यह मुझे बहुत समय बचा लिया! मैं सच्चे पैरामीटर में नहीं डाल रहा था, और इसे एक सरणी के रूप में एक्सेस करने की कोशिश कर रहा था
23

87

trueदूसरे पैरामीटर के रूप में उपयोग करें json_decode। यह stdObjectउदाहरणों के बजाय एक साहचर्य सरणी में json को डिकोड करेगा :

$my_array = json_decode($my_json, true);

देखें प्रलेखन अधिक जानकारी के लिए।



28

जैसा कि Php मैनुअल कहता है,

Print_r - एक चर के बारे में मानव-पठनीय जानकारी प्रिंट करता है

जब हम उपयोग करते हैं json_decode();, तो हमें रिटर्न प्रकार के रूप में stdClass का एक ऑब्जेक्ट मिलता है। तर्क, जो अंदर पारित किया print_r()जाना चाहिए या तो एक सरणी या एक स्ट्रिंग होना चाहिए। इसलिए, हम किसी वस्तु को अंदर नहीं भेज सकते print_r()। मुझे इससे निपटने के 2 तरीके मिले।

  1. सरणी के लिए ऑब्जेक्ट कास्ट करें।
    इसे निम्न प्रकार से प्राप्त किया जा सकता है।

    $a = (array)$object;

  2. जब आप json_decode();फ़ंक्शन का उपयोग करते हैं, तो पहले बताई गई वस्तु की कुंजी तक पहुँच कर , यह stdClass की एक वस्तु लौटाता है। आप ->ऑपरेटर की मदद से ऑब्जेक्ट के तत्वों को एक्सेस कर सकते हैं ।

    $value = $object->key;

यदि ऑब्जेक्ट नेस्टेड एरेज़ है, तो उप तत्वों को निकालने के लिए एक से अधिक कुंजी का उपयोग कर सकते हैं।

$value = $object->key1->key2->key3...;

उनके अन्य विकल्प print_r()भी हैं, जैसे var_dump();और जैसेvar_export();

पुनश्च : इसके अलावा, आप का दूसरा पैरामीटर सेट करते हैं json_decode();करने के लिए true, यह स्वतः ही एक करने के लिए वस्तु में परिवर्तित कर देंगे array();
यहाँ कुछ संदर्भ हैं:
http://php.net/manual/en/function.print-r.php
http: // php.net/manual/en/function.var-dump.php
http://php.net/manual/en/function.var-export.php


12

Json string से परिणाम के रूप में एक सरणी प्राप्त करने के लिए आपको बूलियन ट्रू के रूप में दूसरा पैराम सेट करना चाहिए।

$result = json_decode($json_string, true);
$context = $result['context'];

अन्यथा $ परिणाम एक std वस्तु होगी। लेकिन आप मानों को ऑब्जेक्ट के रूप में एक्सेस कर सकते हैं।

  $result = json_decode($json_string);
 $context = $result->context;


8

जब आप इसे एक्सेस करने का प्रयास करते हैं $result['context'], तो आप इसे एक एरे के रूप में मानते हैं, यह त्रुटि आपको बता रही है कि आप वास्तव में एक वस्तु के साथ काम कर रहे हैं, तो आपको इसे एक्सेस करना चाहिए$result->context


4

यहाँ फ़ंक्शन हस्ताक्षर है:

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

जब परम गलत है, जो डिफ़ॉल्ट है, तो यह एक उपयुक्त php प्रकार लौटाएगा। आप object.method प्रतिमान का उपयोग करके उस प्रकार का मान प्राप्त करते हैं।

जब परम सत्य है, यह साहचर्य सरणियों को लौटाएगा।

यह त्रुटि पर NULL लौटेगा।

यदि आप सरणी के माध्यम से मान प्राप्त करना चाहते हैं, तो सही पर सेट करें।


3

कभी-कभी एपीआई के साथ काम करते समय आप किसी वस्तु को एक वस्तु रखना चाहते हैं। ऑब्जेक्ट को नेस्टेड ऑब्जेक्ट तक पहुँचाने के लिए आप निम्न कार्य कर सकते हैं:

जब आप यह देखेंगे कि आप उस वस्तु को प्रिंट करेंगे तो हम मान लेंगे:

print_r($response);

stdClass object
(
    [status] => success
    [message] => Some message from the data
    [0] => stdClass object
        (
            [first] => Robert
            [last] => Saylor
            [title] => Symfony Developer
        )
    [1] => stdClass object
        (
            [country] => USA
        )
)

ऑब्जेक्ट के पहले भाग को एक्सेस करने के लिए:

print $response->{'status'};

और वह "सफलता" का उत्पादन करेगा

अब अन्य भागों की कुंजी दें:

$first = $response->{0}->{'first'};
print "First name: {$first}<br>";

लाइन ब्रेक के साथ अपेक्षित आउटपुट "रॉबर्ट" होगा।

आप किसी अन्य ऑब्जेक्ट के ऑब्जेक्ट का पुन: असाइन कर सकते हैं।

$contact = $response->{0};
print "First Name: " . $contact->{'first'} . "<br>";

लाइन ब्रेक के साथ अपेक्षित आउटपुट "रॉबर्ट" होगा।

अगली कुंजी "1" तक पहुंचने के लिए प्रक्रिया समान है।

print "Country: " . $response->{1}->{'country'} . "<br>";

अपेक्षित आउटपुट "यूएसए" होगा

उम्मीद है कि यह आपको वस्तुओं को समझने में मदद करेगा और हम एक वस्तु को क्यों रखना चाहते हैं। इसके गुणों तक पहुँचने के लिए आपको किसी ऑब्जेक्ट को सरणी में बदलने की आवश्यकता नहीं होनी चाहिए।


2

कोष्ठक का उपयोग करने के बजाय ऑब्जेक्ट ऑपरेटर का उपयोग करें उदाहरण के लिए डेटाबेस ऑब्जेक्ट के आधार पर मेरा सरणी इस तरह बनाया जाता है जैसे डीबी नामक कक्षा में:

class DB {
private static $_instance = null;
private $_pdo,
        $_query, 
        $_error = false,
        $_results,
        $_count = 0;



private function __construct() {
    try{
        $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') .';dbname=' . Config::get('mysql/db') , Config::get('mysql/username') ,Config::get('mysql/password') );


    } catch(PDOException $e) {
        $this->_error = true;
        $newsMessage = 'Sorry.  Database is off line';
        $pagetitle = 'Teknikal Tim - Database Error';
        $pagedescription = 'Teknikal Tim Database Error page';
        include_once 'dbdown.html.php';
        exit;
    }
    $headerinc = 'header.html.php';
}

public static function getInstance() {
    if(!isset(self::$_instance)) {
        self::$_instance = new DB();
    }

    return self::$_instance;

}


    public function query($sql, $params = array()) {
    $this->_error = false;
    if($this->_query = $this->_pdo->prepare($sql)) {
    $x = 1;
        if(count($params)) {
        foreach($params as $param){
            $this->_query->bindValue($x, $param);
            $x++;
            }
        }
    }
    if($this->_query->execute()) {

        $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
        $this->_count = $this->_query->rowCount();

    }

    else{
        $this->_error = true;
    }

    return $this;
}

public function action($action, $table, $where = array()) {
    if(count($where) ===3) {
        $operators = array('=', '>', '<', '>=', '<=');

        $field      = $where[0];
        $operator   = $where[1];
        $value      = $where[2];

        if(in_array($operator, $operators)) {
            $sql = "{$action} FROM {$table} WHERE {$field} = ?";

            if(!$this->query($sql, array($value))->error()) {
            return $this;
            }
        }

    }
    return false;
}

    public function get($table, $where) {
    return $this->action('SELECT *', $table, $where);

public function results() {
    return $this->_results;
}

public function first() {
    return $this->_results[0];
}

public function count() {
    return $this->_count;
}

}

नियंत्रक स्क्रिप्ट पर इस कोड का उपयोग करने वाली जानकारी तक पहुंचने के लिए:

<?php
$pagetitle = 'Teknikal Tim - Service Call Reservation';
$pagedescription = 'Teknikal Tim Sevice Call Reservation Page';
require_once $_SERVER['DOCUMENT_ROOT'] .'/core/init.php';
$newsMessage = 'temp message';

$servicecallsdb = DB::getInstance()->get('tt_service_calls', array('UserID',
 '=','$_SESSION['UserID']));

if(!$servicecallsdb) {
// $servicecalls[] = array('ID'=>'','ServiceCallDescription'=>'No Service Calls');
} else {
$servicecalls = $servicecallsdb->results();
}
include 'servicecalls.html.php';



?>

उसके बाद मैं यह देखने के लिए जाँच करता हूँ कि क्या सर्विसाइकल्स को सेट किया गया है या नहीं, यह देखने के लिए 0 से अधिक की गिनती है और यह याद रखें कि यह एक सरणी नहीं है जिसका मैं संदर्भ दे रहा हूं इसलिए मैं ऑब्जेक्ट ऑपरेटर के साथ रिकॉर्ड का उपयोग करता हूं "->" इस तरह:

<?php include $_SERVER['DOCUMENT_ROOT'] .'/includes/header.html.php';?>
<!--Main content-->
<div id="mainholder"> <!-- div so that page footer can have a minum height from the
  header -->
<h1><?php if(isset($pagetitle)) htmlout($pagetitle);?></h1>
<br>
<br>
<article>
    <h2></h2>
</article>
<?php
if (isset($servicecalls)) {
if (count ($servicecalls) > 0){
     foreach ($servicecalls as $servicecall) {
        echo '<a href="https://stackoverflow.com/servicecalls/?servicecall=' .$servicecall->ID .'">'
  .$servicecall->ServiceCallDescription .'</a>';
    }
}else echo 'No service Calls';

}

?>
<a href="/servicecalls/?new=true">Raise New Service Call</a>
</div> <!-- Main content end-->
<?php include $_SERVER['DOCUMENT_ROOT'] .'/includes/footer.html.php'; ?>

2

मुझे यह त्रुटि नीले रंग से मिली क्योंकि मेरे फेसबुक लॉगिन ने अचानक काम करना बंद कर दिया (मैंने मेजबानों को भी बदल दिया था) और इस त्रुटि को फेंक दिया। फिक्स वास्तव में आसान है

मुद्दा इस कोड में था

  $response = (new FacebookRequest(
    FacebookSession::newAppSession($this->appId, $this->appSecret),
    'GET',
    '/oauth/access_token',
    $params
  ))->execute()->getResponse(true);

  if (isset($response['access_token'])) {       <---- this line gave error
    return new FacebookSession($response['access_token']);
  }

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

  $response = (array) (new FacebookRequest(
    FacebookSession::newAppSession($this->appId, $this->appSecret),
    'GET',
    '/oauth/access_token',
    $params
  ))->execute()->getResponse(true);

पहली पंक्ति में उपयोग बंद सरणी () मात्रा को नोट करें।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.