ส่งคืน JSON จาก PHP ไปยัง JavaScript หรือไม่


135

ฉันมีสคริปต์ PHP ที่ถูกเรียกผ่าน jQuery AJAX ฉันต้องการสคริปต์ PHP เพื่อส่งคืนข้อมูลในรูปแบบ JSON เป็นจาวาสคริปต์ นี่คือโค้ดหลอกในสคริปต์ PHP:

$json = "{";
foreach($result as $addr)
{
    foreach($addr as $line)
    {
        $json .= $line . "\n";
    }
    $json .= "\n\n";
}
$json .= "}";

โดยทั่วไปฉันต้องการผลลัพธ์ของทั้งสองเพื่อให้ลูปถูกแทรกใน $ json

คำตอบ:


194

Php มีฟังก์ชั่นการทำให้เป็นลำดับ JSON inbuilt

json_encode

json_encode

โปรดใช้สิ่งนี้หากคุณสามารถและไม่ต้องทนทุกข์ทรมานกับโรคที่ไม่ได้คิดค้นที่นี่


2
ยอดเยี่ยมขอบคุณ ฉันค้นหามันจริงๆก่อนโพสต์บน SO แต่ฉันไม่คิดว่ามันจะมีอยู่ในพื้นที่ของฉัน
AquinasTub

'คำตอบ' นี้ไม่สมบูรณ์และค่อนข้างไม่มีประโยชน์ ดูคำตอบจาก aesede สำหรับข้อมูลที่สมบูรณ์มากขึ้น
Funk Doc

@FunkDoc OP ที่เป็นปัญหาถูกรวมเข้าด้วยกัน JSON ด้วยมือภายใต้สมมติฐานที่เป็นทางเลือกเดียวของพวกเขา การรู้ว่ามันไม่ใช่ทางเลือกเดียวของพวกเขานั่นคือทางออกที่เหมาะสม นอกจากนี้ไม่มีข้อผูกมัดว่าผลสุดท้ายของ JSON ที่จะถูกปล่อยออกมาเป็น HTTP การตอบสนอง ข้อมูล "เพิ่มส่วนหัว" ในขณะที่มีประโยชน์สำหรับสถานการณ์หนึ่งจะไม่ช่วยคุณถ้าสิ่งที่คุณทำกับ JSON นั้นไม่ใช่แค่ "ส่งคืนคำต่อท้ายไปยังหน้าเว็บ" คำถามไม่ได้เพิ่มความกระจ่างให้กับผู้ใช้
Kent Fredric

(นอกจากนี้การตั้งค่าส่วนหัวไม่จำเป็นอย่างยิ่งสำหรับ AJAX ขอโทษถ้าฉันดูเหมือนฉับพลัน แต่ร่มเงาที่กำหนดโดยคำว่า "'คำตอบ' 'ในเครื่องหมายคำพูดจริงๆแค่ทำให้ฉันบาดเจ็บมันเป็น 10 ปีที่แล้วปล่อยให้มันตายไปแล้ว ฉันย้ายมาจาก PHP เมื่อนานมาแล้วว่าภาษาที่ฉันย้ายไปตอนนี้ก็ย้ายออกไปจากฉัน)
Kent Fredric

145

ต่อไปนี้เป็นสิ่งที่ขาดหายไปในคำตอบก่อนหน้า:

  1. ตั้งส่วนหัวใน PHP ของคุณ:

    header('Content-type: application/json');
    echo json_encode($array);
  2. json_encode()สามารถส่งคืนอาร์เรย์ JavaScript แทนวัตถุ JavaScript ได้โปรดดู: การ
    ส่งคืน JSON จากสคริปต์ PHP
    สิ่งนี้อาจเป็นสิ่งสำคัญที่ต้องทราบในบางกรณีเนื่องจากอาร์เรย์และวัตถุไม่เหมือนกัน


2
มันเป็นสิ่งสำคัญที่จะต้องทราบว่าข้อมูลเป็นecho ed แทนreturn ed! นั่นทำให้ฉันรู้สึกดีเมื่อได้เรียนรู้แนวคิดครั้งแรก เพราะในการเขียนโปรแกรมทั่วไปเกือบทุกอย่างจะถูกส่งกลับไม่ใช่ "พิมพ์"
Juha Untinen

สวัสดี @Juha โปรดจำไว้ว่าjson_encode()(เช่นเดียวกับทุกฟังก์ชั่น) จะส่งคืนสิ่งที่ (รวมถึงNULL) เสมอ; คุณสามารถพิมพ์ข้อมูลประมวลผลแล้วพิมพ์มัน assing มันให้กับตัวแปรเพื่อใช้ในภายหลังให้บันทึกไว้เป็นไฟล์ ฯลฯ ... คุณสามารถอ่านเพิ่มเติมเกี่ยวกับreturnในPHP: ค่ากลับมา นอกจากนี้คุณสามารถ (และควร!) ตรวจสอบสิ่งที่แต่ละฟังก์ชั่นที่คุณไม่รู้จักกลับมาดูตัวอย่างของเราjson_encode ()มันระบุส่งกลับสตริงเข้ารหัส JSON ในความสำเร็จหรือล้มเหลวในความล้มเหลว
aesede

ย้อนกลับไปฉันสงสัยว่าทำไมreturn json_encode($jsonArray);ไม่ทำงาน (AngularJS http.get ไม่ได้อะไรเลย) จนกระทั่งฉันสังเกตเห็นในภายหลัง :)
Juha Untinen

83

มีส่วนของJSONในเอกสารของ PHP คุณจะต้องใช้ PHP 5.2.0

ตั้งแต่ PHP 5.2.0 ส่วนขยาย JSON จะถูกรวมและเรียบเรียงเป็น PHP โดยค่าเริ่มต้น

ถ้าคุณทำไม่ได้นี่คือห้องสมุด PECL ที่คุณสามารถติดตั้งได้

<?php
    $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

    echo json_encode($arr); // {"a":1,"b":2,"c":3,"d":4,"e":5}
?>

13

โดยปกติแล้วคุณจะสนใจที่จะมีโครงสร้างข้อมูลของคุณในตอนท้ายที่ได้รับ:

json_encode($result)

สิ่งนี้จะเก็บรักษาคีย์อาเรย์ด้วย

อย่าลืมว่า json_encode ใช้งานได้กับข้อมูลที่เข้ารหัส utf8 เท่านั้น


4

คุณสามารถใช้JSON ง่ายสำหรับ PHP มันจะส่งส่วนหัวช่วยให้คุณปลอม JSON

ดูเหมือนว่า :

<?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();
?>

คำเตือน: Simple JSON สำหรับ PHP ได้รับสิทธิ์การใช้งาน GPLv2 ดังนั้นโค้ดของคุณต้องเป็นโอเพ่นซอร์สเพื่อใช้งาน
เจมี่เบิร์ช

1
ตอนนี้ใบอนุญาต MIT :)
อเล็กซิส Paques

1
@JamieBirch ในทางปฏิบัติฉันคิดว่าคุณเข้าใจผิดว่า GPL ทำงานอย่างไร หากคุณกำลังพูดถึง AGPL คุณจะต้องทำอะไรบางอย่าง แต่การพูดคุยกันอย่างกว้างขวางของอินเทอร์เน็ตนั้นสร้างขึ้นจากซอฟต์แวร์ GPL และไม่มีภาระผูกพันในการเปิดซอร์สโค้ดของพวกเขาเพราะพวกเขาไม่ได้ให้ผู้ใช้สามารถปฏิบัติการได้ภายใต้การควบคุมของพวกเขา หน้าที่เดียวที่พวกเขามีคือทุกคนที่ให้สำเนาดิจิทัลของโครงการต้องได้รับแหล่งข้อมูลด้วย
Kent Fredric

1

$ msg = "คุณใส่ชื่อผู้ใช้หรือรหัสผ่านผิด"; $ การตอบ = json_encode ($ ผงชูรส);

echo "{\"status\" : \"400\", \"responce\" : \"603\", \"message\" : \"You Enter Wrong Username OR Password\", \"feed\":".str_replace("<p>","",$responso). "}";
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.