PHP स्क्रिप्ट से JSON लौटना


875

मैं JSON को एक PHP स्क्रिप्ट से वापस करना चाहता हूं।

क्या मैं सिर्फ परिणाम की प्रतिध्वनि करता हूं? क्या मुझे Content-Typeहेडर सेट करना है ?

जवाबों:


1602

जब आप आम तौर पर इसके बिना ठीक होते हैं, तो आपको सामग्री-प्रकार हेडर सेट करना चाहिए और:

<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);

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


9
बस मामले में: आपको हेडर का उपयोग करना चाहिए (केवल पहले से भेजे गए हेडर से बचने के लिए आउटपुट बफरिंग के साथ-साथ कमांड भी
केविन

6
Php फ़ाइल को बिना BOM :) के UTF-8 में कूटबद्ध किया जाना है
Krzysztof Kalinowski

217
header('Content-type:application/json;charset=utf-8');
टिमो हुओवेनन

14
@mikepote मुझे वास्तव में नहीं लगता कि PHP फ़ाइल के शीर्ष पर हेडर कमांड होना आवश्यक है। यदि आप अनजाने में सामान बाहर थूक रहे हैं और यह आपके हेडर कमांड को ट्रिप कर रहा है, तो आपको अपना कोड ठीक करने की आवश्यकता है क्योंकि यह टूट गया है।
हाफस्टॉप १op

8
@KrzysztofKalinowski नहीं, PHP फ़ाइल को UTF-8 एन्कोडेड होने की आवश्यकता नहीं है। आउटपुट UTF-8 एनकोड होना चाहिए। उन गलत बयानों से गैर-अनुभवी उपयोगकर्ताओं को यह जानने में मदद नहीं मिलती है कि चीजों को टूटने से कैसे बचा जाए, लेकिन यह उन पर मिथकों को बढ़ाने में मदद करता है और कभी भी यह नहीं सीखता कि कौन सी भूमिका धाराओं पर काम करती है और वे कैसे काम करती हैं।
16एक्सल कोस्टास पेना

124

JSON से लौटने वाले अच्छे और स्पष्ट PHP कोड का एक पूरा टुकड़ा है:

$option = $_GET['option'];

if ( $option == 1 ) {
    $data = [ 'a', 'b', 'c' ];
    // will encode to JSON array: ["a","b","c"]
    // accessed as example in JavaScript like: result[1] (returns "b")
} else {
    $data = [ 'name' => 'God', 'age' => -1 ];
    // will encode to JSON object: {"name":"God","age":-1}  
    // accessed as example in JavaScript like: result.name or result['name'] (returns "God")
}

header('Content-type: application/json');
echo json_encode( $data );

44

विधि पर मैनुअल केjson_encode अनुसार एक गैर-स्ट्रिंग ( गलत ) वापस कर सकते हैं :

सफलता FALSEपर या विफलता पर एक JSON एन्कोडेड स्ट्रिंग लौटाता है ।

जब ऐसा होता है echo json_encode($data)तो रिक्त स्ट्रिंग को आउटपुट करेगा, जो कि JSON अमान्य है

json_encodeउदाहरण के लिए विफल (और वापसी false) अगर इसके तर्क में एक गैर UTF-8 स्ट्रिंग शामिल है।

इस त्रुटि स्थिति को PHP में कैप्चर किया जाना चाहिए, उदाहरण के लिए इस तरह:

<?php
header("Content-Type: application/json");

// Collect what you need in the $data variable.

$json = json_encode($data);
if ($json === false) {
    // Avoid echo of empty string (which is invalid JSON), and
    // JSONify the error message instead:
    $json = json_encode(["jsonError" => json_last_error_msg()]);
    if ($json === false) {
        // This should not happen, but we go all the way now:
        $json = '{"jsonError":"unknown"}';
    }
    // Set HTTP response status code to: 500 - Internal Server Error
    http_response_code(500);
}
echo $json;
?>

तब प्राप्त अंत में निश्चित रूप से पता होना चाहिए कि jsonError संपत्ति की उपस्थिति एक त्रुटि स्थिति को इंगित करती है, जिसे इसके अनुसार इलाज करना चाहिए।

उत्पादन मोड में ग्राहक को केवल सामान्य त्रुटि स्थिति भेजना और बाद की जांच के लिए अधिक विशिष्ट त्रुटि संदेश लॉग करना बेहतर हो सकता है।

PHP के प्रलेखन में JSON त्रुटियों से निपटने के बारे में और पढ़ें ।


2
charsetJSON के लिए कोई पैरामीटर नहीं है ; उपकरण के अंत में नोट देखें ।ietf.org / html / rfc8259#section-11 : "इस पंजीकरण के लिए कोई 'चारसेट' पैरामीटर परिभाषित नहीं किया गया है। किसी को जोड़ने से वास्तव में प्राप्तकर्ताओं पर कोई प्रभाव नहीं पड़ता है।" (JSON को UTF-8 प्रति टूल्स.ietf.org/html/rfc8259#section-8.1 के रूप में प्रेषित किया जाना चाहिए , ताकि यह निर्दिष्ट किया जा सके कि यह UTF-8 के रूप में एन्कोड किया गया है। थोड़ा बेमानी है।)
पैट्रिक डार्क

1
उस पर प्रकाश डालने के लिए धन्यवाद, @PatrickDark। charsetHTTP शीर्ष लेख स्ट्रिंग से अनावश्यक पैरामीटर हटा दिया गया।
trincot

38

डेटा एन्कोड करने के लिए json_encode का प्रयास करें और सामग्री-प्रकार सेट करें header('Content-type: application/json');


15

सामग्री प्रकार के साथ सेट करें header('Content-type: application/json');और फिर अपना डेटा प्रतिध्वनित करें।


12

पहुँच सुरक्षा सेट करना भी अच्छा है - बस उस डोमेन को बदलें जो आप उस तक पहुँचना चाहते हैं।

<?php
header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');
    $response = array();
    $response[0] = array(
        'id' => '1',
        'value1'=> 'value1',
        'value2'=> 'value2'
    );

echo json_encode($response); 
?>

यहाँ उस पर अधिक नमूने हैं: एक्सेस-कंट्रोल-अनुमति-उत्पत्ति को कैसे बायपास करें?


7
<?php
$data = /** whatever you're serializing **/;
header("Content-type: application/json; charset=utf-8");
echo json_encode($data);
?>

हेडर में चारसेट को बताते हुए क्या अंतर है? कृपया समझाएं, धन्यवाद।
Sanxofon

6

जैसा कि ऊपर कहा गया है:

header('Content-Type: application/json');

नौकरी कर लेंगे। लेकिन ध्यान रखें कि:

  • इस हेडर का उपयोग न करने पर भी Ajax को json पढ़ने में कोई समस्या नहीं होगी, सिवाय इसके कि अगर आपके json में कुछ HTML टैग हैं। इस मामले में आपको हेडर को एप्लिकेशन / जसन के रूप में सेट करना होगा।

  • सुनिश्चित करें कि आपकी फ़ाइल UTF8-BOM में एन्कोडेड नहीं है। यह प्रारूप फ़ाइल के शीर्ष में एक चरित्र जोड़ता है, इसलिए आपका हेडर () कॉल विफल हो जाएगा।


4

HTTP स्थिति कोड के साथ JSON प्रतिक्रिया देने के लिए एक सरल कार्य ।

function json_response($data=null, $httpStatus=200)
{
    header_remove();

    header("Content-Type: application/json");

    http_response_code($httpStatus);

    echo json_encode($data);

    exit();
}

1
header_remove, और स्पष्ट रूप से http प्रतिक्रिया सेट करना एक अच्छा विचार है; हालाँकि सेटिंग स्टेटस और फिर http_response बेमानी लगता है। exitअंत में एक बयान भी जोड़ना चाह सकते हैं । मैंने आपके फ़ंक्शन को @trincot के साथ जोड़ दिया: stackoverflow.com/a/35391449/339440
स्टीफन आर

सलाह के लिये धन्यवाद। मैंने अभी जवाब अपडेट किया है।
डैन

3

आपके प्रश्न का उत्तर यहाँ है ,

इसे कहते हैं।

JSON पाठ के लिए MIME मीडिया प्रकार अनुप्रयोग / json है।

इसलिए यदि आप हेडर को उस प्रकार पर सेट करते हैं, और अपने JSON स्ट्रिंग को आउटपुट करते हैं, तो यह काम करना चाहिए।


1

हाँ, आपको आउटपुट प्रदर्शित करने के लिए इको का उपयोग करना होगा। Mimetype: application / json


1

यदि आपको php से json प्राप्त करने की आवश्यकता header('Content-Type: application/json');है, तो कस्टम सूचना भेजने से आप इसे जोड़ सकते हैं, इससे पहले कि आप किसी अन्य चीज़ को प्रिंट कर सकें, तो फिर आप इसे प्रिंट कर सकते हैंecho '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';


1

यदि आप किसी डेटाबेस को क्वेरी करते हैं और JSON प्रारूप में सेट किए गए परिणाम की आवश्यकता होती है तो इसे इस तरह किया जा सकता है:

<?php

$db = mysqli_connect("localhost","root","","mylogs");
//MSG
$query = "SELECT * FROM logs LIMIT 20";
$result = mysqli_query($db, $query);
//Add all records to an array
$rows = array();
while($row = $result->fetch_array()){
    $rows[] = $row;
}
//Return result to jTable
$qryResult = array();
$qryResult['logs'] = $rows;
echo json_encode($qryResult);

mysqli_close($db);

?>

JQuery का उपयोग करके परिणाम को पार्स करने में मदद के लिए इस ट्यूटोरियल को देखें


1

यह पुरुष महिला और उपयोगकर्ता आईडी को वापस करने के लिए एक सरल PHP स्क्रिप्ट है क्योंकि json मान किसी भी यादृच्छिक मूल्य होगा जैसा कि आप स्क्रिप्ट json.php कहते हैं।

आशा है कि यह मदद धन्यवाद

<?php
header("Content-type: application/json");
$myObj=new \stdClass();
$myObj->user_id = rand(0, 10);
$myObj->male = rand(0, 5);
$myObj->female = rand(0, 5);
$myJSON = json_encode($myObj);
echo $myJSON;
?>

JSON टेक्स्ट के लिए MIME मीडिया प्रकार अनुप्रयोग / json है
AA

0

JSON पर अपने डोमेन ऑब्जेक्ट्स को फॉर्मेट करने का एक आसान तरीका मार्शल सीरियलाइज़र का उपयोग करना है । फिर डेटा को पास करें json_encodeऔर अपनी आवश्यकताओं के लिए सही सामग्री-प्रकार हेडर भेजें। यदि आप सिम्फनी जैसे ढांचे का उपयोग कर रहे हैं, तो आपको हेडर को मैन्युअल रूप से सेट करने की आवश्यकता नहीं है। वहां आप JsonResponse का उपयोग कर सकते हैं

उदाहरण के लिए जावास्क्रिप्ट से निपटने के लिए सही सामग्री-प्रकार होगा application/javascript

या अगर आपको कुछ बहुत पुराने ब्राउज़रों का समर्थन करने की आवश्यकता है तो सबसे सुरक्षित होगा text/javascript

अन्य सभी उद्देश्यों के लिए जैसे मोबाइल ऐप का उपयोग application/jsonसामग्री-प्रकार के रूप में किया जाता है।

यहाँ एक छोटा सा उदाहरण है:

<?php
...
$userCollection = [$user1, $user2, $user3];

$data = Marshal::serializeCollectionCallable(function (User $user) {
    return [
        'username' => $user->getUsername(),
        'email'    => $user->getEmail(),
        'birthday' => $user->getBirthday()->format('Y-m-d'),
        'followers => count($user->getFollowers()),
    ];
}, $userCollection);

header('Content-Type: application/json');
echo json_encode($data);

0

जब भी आप एपीआई के लिए JSON प्रतिक्रिया को वापस करने की कोशिश कर रहे हैं या सुनिश्चित करें कि आपके पास उचित हेडर हैं और यह भी सुनिश्चित करें कि आप एक वैध JSON डेटा लौटाते हैं।

यहां नमूना स्क्रिप्ट है जो आपको PHP सरणी से या JSON फ़ाइल से JSON प्रतिक्रिया को वापस करने में मदद करती है।

PHP स्क्रिप्ट (कोड):

<?php

// Set required headers
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');

/**
 * Example: First
 *
 * Get JSON data from JSON file and retun as JSON response
 */

// Get JSON data from JSON file
$json = file_get_contents('response.json');

// Output, response
echo $json;

/** =. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.  */

/**
 * Example: Second
 *
 * Build JSON data from PHP array and retun as JSON response
 */

// Or build JSON data from array (PHP)
$json_var = [
  'hashtag' => 'HealthMatters',
  'id' => '072b3d65-9168-49fd-a1c1-a4700fc017e0',
  'sentiment' => [
    'negative' => 44,
    'positive' => 56,
  ],
  'total' => '3400',
  'users' => [
    [
      'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
      'screen_name' => 'rayalrumbel',
      'text' => 'Tweet (A), #HealthMatters because life is cool :) We love this life and want to spend more.',
      'timestamp' => '{{$timestamp}}',
    ],
    [
      'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
      'screen_name' => 'mikedingdong',
      'text' => 'Tweet (B), #HealthMatters because life is cool :) We love this life and want to spend more.',
      'timestamp' => '{{$timestamp}}',
    ],
    [
      'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
      'screen_name' => 'ScottMili',
      'text' => 'Tweet (C), #HealthMatters because life is cool :) We love this life and want to spend more.',
      'timestamp' => '{{$timestamp}}',
    ],
    [
      'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
      'screen_name' => 'yogibawa',
      'text' => 'Tweet (D), #HealthMatters because life is cool :) We love this life and want to spend more.',
      'timestamp' => '{{$timestamp}}',
    ],
  ],
];

// Output, response
echo json_encode($json_var);

JSON फाइल (JSON DATA):

{
    "hashtag": "HealthMatters", 
    "id": "072b3d65-9168-49fd-a1c1-a4700fc017e0", 
    "sentiment": {
        "negative": 44, 
        "positive": 56
    }, 
    "total": "3400", 
    "users": [
        {
            "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", 
            "screen_name": "rayalrumbel", 
            "text": "Tweet (A), #HealthMatters because life is cool :) We love this life and want to spend more.", 
            "timestamp": "{{$timestamp}}"
        }, 
        {
            "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", 
            "screen_name": "mikedingdong", 
            "text": "Tweet (B), #HealthMatters because life is cool :) We love this life and want to spend more.", 
            "timestamp": "{{$timestamp}}"
        }, 
        {
            "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", 
            "screen_name": "ScottMili", 
            "text": "Tweet (C), #HealthMatters because life is cool :) We love this life and want to spend more.", 
            "timestamp": "{{$timestamp}}"
        }, 
        {
            "profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg", 
            "screen_name": "yogibawa", 
            "text": "Tweet (D), #HealthMatters because life is cool :) We love this life and want to spend more.", 
            "timestamp": "{{$timestamp}}"
        }
    ]
}

JSON Screeshot:

यहां छवि विवरण दर्ज करें


-1

आप इस छोटी सी PHP लाइब्रेरी का उपयोग कर सकते हैं । यह हेडर भेजता है और आपको आसानी से उपयोग करने के लिए एक वस्तु देता है।

ऐसा लग रहा है :

<?php
// Include the json class
include('includes/json.php');

// Then create the PHP-Json Object to suits your needs

// Set a variable ; var name = {}
$Json = new json('var', 'name'); 
// Fire a callback ; callback({});
$Json = new json('callback', 'name'); 
// Just send a raw JSON ; {}
$Json = new json();

// Build data
$object = new stdClass();
$object->test = 'OK';
$arraytest = array('1','2','3');
$jsonOnly = '{"Hello" : "darling"}';

// Add some content
$Json->add('width', '565px');
$Json->add('You are logged IN');
$Json->add('An_Object', $object);
$Json->add("An_Array",$arraytest);
$Json->add("A_Json",$jsonOnly);

// Finally, send the JSON.

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