मैं PHP के साथ JSON से डेटा कैसे निकालूं?


214

यह एक सामान्य संदर्भ प्रश्न और उत्तर कभी न खत्म होने वाले कई को कवर करने का इरादा है "मैं अपने JSON में डेटा का उपयोग कैसे करूं?" प्रशन। यह PHP में JSON को डिकोड करने और परिणामों तक पहुंचने की व्यापक मूल बातें को संभालने के लिए है।

मेरे पास JSON है:

{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}

मैं इसे PHP में कैसे डिकोड करूं और परिणामी डेटा तक पहुंच पाऊं?



कृपया मुझे पता है सकते हैं यही कारण है कि इस सवाल का कोई डुप्लिकेट प्रश्न के रूप में के लिए एक नकली के रूप में चिह्नित भी 9 या उससे कम उन पर विचार नहीं stackoverflow.com/questions/4343596/parsing-json-file-with-php ? M
मैं

@IamtheMostStupidPerson मैं समझाने की कोशिश करूंगा, हालांकि आपका उपयोगकर्ता नाम मुझे संदेह है कि आप इसे प्राप्त करेंगे;)। यह प्रश्न पूछा जाता है, और इसके उत्तर "कैनोनिकल" तरीके से लिखे जाते हैं। जैसे, यह अन्य प्रश्नों की तुलना में डुप्लिकेट लक्ष्य के लिए बेहतर प्राप्तकर्ता है।
फेलिक्स गगनोन-ग्रेनियर

जवाबों:


428

पहचान

सबसे पहले आपके पास एक स्ट्रिंग है। JSON कोई सरणी, ऑब्जेक्ट या डेटा संरचना नहीं है। JSON एक टेक्स्ट-आधारित क्रमांकन प्रारूप है - इसलिए एक फैंसी स्ट्रिंग है, लेकिन अभी भी सिर्फ एक स्ट्रिंग है। इसका उपयोग करके PHP में Decode करें json_decode()

 $data = json_decode($json);

उसमें आपको मिल सकता है:

ये वो चीजें हैं जो JSON में एनकोड की जा सकती हैं। या अधिक सटीक रूप से, ये उन चीज़ों के PHP संस्करण हैं जो JSON में एन्कोड किए जा सकते हैं।

उनके बारे में कुछ खास नहीं है। वे "JSON ऑब्जेक्ट्स" या "JSON सरणियाँ" नहीं हैं। आपने JSON को डिकोड किया है - अब आपके पास हर रोज़ PHP प्रकार के बेसिक हैं

ऑब्जेक्ट्स stdClass के उदाहरण होंगे , एक बिल्ट-इन क्लास जो सिर्फ एक सामान्य बात है जो यहाँ महत्वपूर्ण नहीं है।


वस्तु गुणों तक पहुँचना

आप इनमें से किसी एक वस्तु के गुणों का उपयोग उसी तरह करते हैं जैसे आप किसी अन्य वस्तु के सार्वजनिक गैर-स्थिर गुणों के लिए करते हैं, जैसे $object->property

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut

पहुंच तत्व

आप इनमें से किसी एक एरे के तत्वों को उसी तरह एक्सेस करते हैं, जैसे आप किसी अन्य ऐरे के लिए करते हैं $array[0]

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

के साथ उस पर Iterate करें foreach

foreach ($toppings as $topping) {
    echo $topping, "\n";
}


स्प्रिंकल्स
मेपल के साथ चमकता हुआ चॉकलेट

या किसी भी बिलियन बिल्ट-इन एरे फ़ंक्शन के साथ गड़बड़ करें ।


नेस्टेड आइटम तक पहुंचना

वस्तुओं के गुण और सरणियों के तत्व अधिक वस्तुएं और / या सरणियाँ हो सकते हैं - आप बस उनके गुणों और सदस्यों को हमेशा की तरह एक्सेस करना जारी रख सकते हैं, जैसे $object->array[0]->etc

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

echo $yummy->toppings[2]->id; //5004

Json_decode ()true के दूसरे तर्क के रूप में पासिंग

जब आप ऐसा करते हैं, तो वस्तुओं के बजाय आपको साहचर्य सरणियाँ मिलेंगी - कुंजियों के लिए सरणियाँ। फिर आप हमेशा की तरह तत्वों तक पहुँचते हैं, जैसे $array['key']

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json, true);

echo $yummy['toppings'][2]['type']; //Maple

सहयोगी सरणी आइटम तक पहुँचना

जब एक JSON ऑब्जेक्ट को एक सहयोगी PHP सरणी में डिकोड किया जाता है, तो आप foreach (array_expression as $key => $value)सिंटैक्स का उपयोग करके कुंजी और मान दोनों को पुनरावृत्त कर सकते हैं , जैसे

$json = '
{
    "foo": "foo value",
    "bar": "bar value",
    "baz": "baz value"
}';

$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
    echo "The value of key '$key' is '$value'", PHP_EOL;
}

प्रिंटों

कुंजी 'फू' का मूल्य 'फू वैल्यू' है
, कुंजी 'बार' का मूल्य 'बार वैल्यू' है
, कुंजी 'बाज' का मूल्य 'बाज मूल्य' है


पता नहीं कैसे डेटा संरचित है

JSON से आपको जो भी मिल रहा है, उसके लिए प्रलेखन पढ़ें।

JSON को देखें - जहाँ आप देखते हैं घुंघराले कोष्ठक {}एक वस्तु की अपेक्षा करते हैं, जहाँ आप देखते हैं कि वर्ग कोष्ठक []एक सरणी की अपेक्षा करते हैं।

डीकोड किए गए डेटा को एक साथ मारो print_r():

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

print_r($yummy);

और आउटपुट की जाँच करें:

stdClass Object
(
    [type] => donut
    [name] => Cake
    [toppings] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 5002
                    [type] => Glazed
                )

            [1] => stdClass Object
                (
                    [id] => 5006
                    [type] => Chocolate with Sprinkles
                )

            [2] => stdClass Object
                (
                    [id] => 5004
                    [type] => Maple
                )

        )

)

यह आपको बताएगा कि आपके पास कहाँ वस्तुएं हैं, जहां आपके पास सरणियाँ हैं, साथ ही उनके सदस्यों के नाम और मूल्य भी हैं।

यदि आप केवल खो जाने से पहले ही इसे प्राप्त कर सकते हैं - उस दूर तक जाएं और उसके साथ टकराएं print_r():

print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

इस आसान इंटरैक्टिव JSON एक्सप्लोरर में इसे देखें ।

समस्या को ऐसे टुकड़ों में तोड़ें जो आपके सिर को चारों ओर लपेटने में आसान हों।


json_decode() रिटर्न null

ऐसा इसलिए होता है क्योंकि या तो:

  1. JSON, सिर्फ इतना है कि जिसमें संपूर्ण रूप null
  2. JSON अमान्य है - JSONLintjson_last_error_msg जैसी किसी चीज़ के माध्यम से परिणाम की जाँच करें या इसे रखें
  3. इसमें 512 से अधिक गहरे स्तर के नेस्टेड तत्व होते हैं। इस डिफ़ॉल्ट अधिकतम गहराई को तीसरे तर्क के रूप में पूर्णांक पास करके ओवरराइड किया जा सकता है json_decode()

यदि आपको अधिकतम गहराई को बदलने की आवश्यकता है तो आप शायद गलत समस्या को हल कर रहे हैं। पता करें कि आपको ऐसा गहरा नेस्टेड डेटा क्यों मिल रहा है (जैसे कि जिस सेवा को आप JSON जनरेट कर रहे हैं वह बग है) और कहा कि ऐसा न हो।


ऑब्जेक्ट प्रॉपर्टी नाम में एक विशेष वर्ण होता है

कभी-कभी आपके पास एक ऑब्जेक्ट प्रॉपर्टी का नाम होगा जिसमें हाइफ़न -या साइन जैसे कुछ होते हैं जो कि @शाब्दिक पहचानकर्ता में उपयोग नहीं किए जा सकते हैं। इसके बजाय आप इसे संबोधित करने के लिए घुंघराले ब्रेस के भीतर एक स्ट्रिंग शाब्दिक का उपयोग कर सकते हैं।

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

यदि आपके पास एक पूर्णांक है जैसा कि संपत्ति देखें: पूर्णांक जैसे नामों के साथ ऑब्जेक्ट गुणों तक कैसे पहुंचें? संधर्भ से।


किसी ने आपके JSON में JSON डाल दिया

यह हास्यास्पद है, लेकिन ऐसा होता है - JSON आपके JSON के भीतर एक स्ट्रिंग के रूप में एन्कोड किया गया है। डिकोड, पहुँच हमेशा की तरह स्ट्रिंग, डिकोड कि , और अंततः आपको क्या चाहिए करने के लिए मिलता है।

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed

डेटा मेमोरी में फिट नहीं होता है

यदि आपका JSON बहुत बड़ा है json_decode(), तो एक बार चीजों को संभालना मुश्किल हो जाता है। देख:


इसे कैसे छाँटा जाए

देखें: संदर्भ: PHP में सरणियों और डेटा को सॉर्ट करने के लिए सभी बुनियादी तरीके


बस इस जवाब पर ठोकर खाई और पाया कि array.include-once.org का लिंक टूट गया है।
जेफ

@ जेफ धन्यवाद। उस बारे में शर्म आती है। मैंने लिंक हटा दिया है।
user3942918

हाँ, लिंक के नाम पर विचार करने और आपने इसे कैसे वर्णित किया है, यह एक असली बमर की तरह लगता है।
जेफ

केवल इस समाधान की कमी है कि किसी अन्य json फ़ाइल से डेटा कैसे निकाला जाए। : मैं सिफारिश करेंगे, इस solutuon stackoverflow.com/questions/19758954/...
इशान श्रीवास्तव

यह भी खूब रही। धन्यवाद।
डेविड करियुकी

17

Json string को PHP object / array में बदलने के लिए आप json_decode () का उपयोग कर सकते हैं ।

उदाहरण के लिए।

इनपुट:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

आउटपुट:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

याद रखने के लिए कुछ बिंदु:

  • json_decodeस्ट्रिंग को वैध होने की आवश्यकता होती है jsonऔर यह वापस आ जाएगी NULL
  • डिकोड करने में विफलता की स्थिति में, json_last_error()त्रुटि की सटीक प्रकृति को निर्धारित करने के लिए उपयोग किया जा सकता है।
  • सुनिश्चित करें कि आप utf8सामग्री में पास हो गए हैं, या json_decodeत्रुटि हो सकती है और बस एक NULLमान लौटा सकते हैं ।

ठीक है, वे शायद इसकी सादगी को पसंद नहीं करते, फिर भी। आप हमेशा उत्थान कर सकते हैं;)
मोहम्मद अब्दुल मुजीब

1
संभवतः अधिक संभावित कारण यह है कि यह पहले ही उत्तर दिया जा चुका है और ऐसा लगता है कि @MohdAbdulMujib कुछ मुफ्त रेप के बाद है
इसहाक

3
@ कुछ लोग पूरे मैनुअल को पढ़ने में बहुत उत्सुक नहीं हो सकते हैं जब वे केवल फ़ंक्शन का उपयोग करके शुरू करना चाहते हैं। अन्यथा वे आधिकारिक डॉक्टर को पढ़ना बेहतर होगा। SO का संपूर्ण बिंदु वह सरलता है जिसमें उत्तर दिए गए हैं। IMHO
मोहम्मद अब्दुल मुजीब

3
// Using json as php array 

$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';

//or use from file
//$json = file_get_contents('results.json');

$someArray = json_decode($json, true);

foreach ($someArray as $key => $value) {
    echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}

1

हम php में json_decode फ़ंक्शन का उपयोग करके json string को सरणी में डीकोड कर सकते हैं

1) json_decode ($ json_string) // यह ऑब्जेक्ट लौटाता है

2) json_decode ($ json_string, true) // यह सरणी देता है

$json_string = '{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';
$array = json_decode($json_string,true);

echo $array['type']; //it gives donut

0

Https://packagist.org/packages/flow/jsonpath का उपयोग करने पर विचार JSONPath करें

इसका उपयोग करने का एक बहुत स्पष्ट विवरण है और प्रस्तावित सभी छोरों से बचने के लिए JSON-फ़ाइल को पार्स करना है । आप से परिचित हैं XPathके लिए XMLआप इस दृष्टिकोण प्यार शुरू कर देंगे।


-1

मैंने एक पैकेज लिखा है जिसका नाम है JSON( GitHub , Packagist )। यदि आप json_*कार्यों का उपयोग करने के ओवरहेड्स को रोकना चाहते हैं , तो आपको इसे आज़माना चाहिए।

उदाहरण

use MAChitgarha\Component\JSON;

$jsonStr = <<<JSON
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}
JSON;

// Create an instance
$json = new JSON($jsonStr);

// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles

// Iterate over an element
foreach ($json->iterate("toppings") as $item)
    echo "{$item->id}: {$item->type}", PHP_EOL;

// Change an element
$json->set("toppings.3", [
    "id" => "5000",
    "type" => "Unknown"
]);

// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();

इससे परिचित होने के लिए विकी , या त्वरित ट्यूटोरियल देखें ।

इसके अलावा, यदि आप JSON फ़ाइलों को पढ़ना चाहते हैं और इसके डेटा को निकालना चाहते हैं (जैसा कि ऐसा लगता है कि आप यह प्रदर्शन करने की कोशिश कर रहे हैं), JSONFile पैकेज देखें , जो मैंने इसे लिखा है, भी।


-2

https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w

JSON को सरणी में परिवर्तित करने के लिए नीचे दिए गए कोड की जांच करें PHP, यदि JSON सही है, तो json_decode()अच्छी तरह से काम करता है, और एक सरणी लौटाएगा, लेकिन यदि JSON विकृत है, तो यह वापस आ जाएगा NULL,

<?php
function jsonDecode1($json){
    $arr = json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );

यदि JSON विकृत है, और आप केवल सरणी की उम्मीद कर रहे हैं, तो आप इस फ़ंक्शन का उपयोग कर सकते हैं,

<?php
function jsonDecode2($json){
    $arr = (array) json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );

यदि JSON विकृत है, और आप कोड निष्पादन को रोकना चाहते हैं, तो आप इस फ़ंक्शन का उपयोग कर सकते हैं,

<?php
function jsonDecode3($json){
    $arr = (array) json_decode($json, true);

    if(empty(json_last_error())){
        return $arr;
    }
    else{
        throw new ErrorException( json_last_error_msg() );
    }
}

// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );

आप अपनी आवश्यकता पर निर्भर करता है किसी भी समारोह का उपयोग कर सकते हैं,

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