Trả lại JSON từ PHP sang JavaScript?


135

Tôi có một đoạn mã PHP được gọi thông qua jQuery AJAX. Tôi muốn tập lệnh PHP trả lại dữ liệu ở định dạng JSON cho javascript. Đây là mã giả trong tập lệnh PHP:

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

Về cơ bản, tôi cần kết quả của cả hai cho các vòng lặp được chèn vào $ json.

Câu trả lời:


194

Php có chức năng Nối tiếp JSON sẵn có.

json_encode

json_encode

Vui lòng sử dụng nếu bạn có thể và không mắc phải hội chứng Not Invented Here.


2
Tuyệt vời cảm ơn bạn. Tôi đã thực sự tìm kiếm điều này trước khi đăng lên SO, nhưng tôi không nghĩ nó sẽ có sẵn trên máy chủ của mình.
AquinasTub

'Câu trả lời' này không đầy đủ và khá không hữu ích. Xem câu trả lời từ aesede để biết thêm thông tin đầy đủ.
Funk Doc

@FunkDoc OP trong câu hỏi đã xâu chuỗi JSON bằng tay, với giả định đó là lựa chọn duy nhất của họ. Biết rằng đó không phải là lựa chọn duy nhất của họ là một giải pháp phù hợp. Không nghĩa vụ rằng kết quả cuối cùng của JSON đó sẽ được phát ra dưới dạng phản hồi HTTP. Thông tin "thêm tiêu đề", mặc dù hữu ích cho một tình huống, sẽ không giúp bạn nếu những gì bạn đang làm với JSON đó không chỉ đơn giản là "trả lại nguyên văn cho trang web". Câu hỏi đã không thêm làm rõ cho usecase.
Kent Fredric

. Tôi đã chuyển từ PHP từ rất lâu rồi mà ngôn ngữ tôi chuyển đến bây giờ tôi cũng chuyển đi.)
Kent Fredric

145

Dưới đây là một vài điều còn thiếu trong các câu trả lời trước:

  1. Đặt tiêu đề trong PHP của bạn:

    header('Content-type: application/json');
    echo json_encode($array);
    
  2. json_encode()có thể trả về một mảng JavaScript thay vì đối tượng JavaScript , xem:
    Trả về JSON từ tập lệnh PHP
    Điều này có thể quan trọng để biết trong một số trường hợp vì mảng và đối tượng không giống nhau.


2
Điều quan trọng cần lưu ý là dữ liệu là echo ed thay vì return ed! Điều đó làm tôi rất vui khi lần đầu tiên học khái niệm này. Bởi vì trong lập trình chung, hầu hết mọi thứ thường được trả về không được "in".
Juha Untinen 7/10/2015

Này @Juha, hãy nhớ rằng json_encode()(giống như tất cả các hàm) luôn trả về một cái gì đó (bao gồm NULL); bạn có thể in các dữ liệu, xử lý nó và sau đó in nó, assing nó vào một biến để sử dụng sau, tiết kiệm nó vào một tập tin, vv ... Bạn có thể đọc thêm về returntrong PHP: Quay trở lại giá trị . Ngoài ra, bạn có thể (và nên!) Kiểm tra xem mỗi hàm bạn không biết trả về là gì, hãy xem ví dụ của chúng tôi json_encode ()trả về một chuỗi được mã hóa JSON khi thành công hoặc FALSE khi thất bại.
aesede

Trước đó, tôi đã tự hỏi tại sao return json_encode($jsonArray);không hoạt động (AngularJS http.get không nhận được gì), cho đến khi tôi nhận thấy nó :)
Juha Untinen

83

Có một phần JSON trong tài liệu của PHP. Bạn sẽ cần PHP 5.2.0 mặc dù.

Kể từ phiên bản PHP 5.2.0, phần mở rộng JSON được gói và biên dịch thành PHP theo mặc định.

Nếu bạn không, đây là thư viện PECL bạn có thể cài đặt.

<?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

Thông thường, bạn sẽ quan tâm đến việc có một số cấu trúc cho dữ liệu của bạn trong phần cuối nhận:

json_encode($result)

Điều này sẽ bảo vệ các phím mảng là tốt.

Hãy nhớ rằng json_encode chỉ hoạt động trên dữ liệu được mã hóa utf8.


4

Bạn có thể sử dụng JSON đơn giản cho PHP . Nó sẽ gửi các tiêu đề giúp bạn giả mạo JSON.

Nó có vẻ như :

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

Cảnh báo: JSON đơn giản cho PHP được cấp phép GPLv2, do đó mã riêng của bạn phải là nguồn mở để sử dụng nó.
Jamie Birch

1
Bây giờ là giấy phép MIT :)
Alexis Paques

1
@JamieBirch Trong thực tế tôi nghĩ bạn đang hiểu sai về cách GPL hoạt động. Nếu bạn đang nói về AGPL, thì bạn sẽ tham gia vào một cái gì đó. Nhưng các mạng internet rộng lớn được xây dựng trên phần mềm GPL và không có nghĩa vụ phải mở mã nguồn của họ, vì họ không cung cấp cho người dùng bất kỳ sự thực thi nào dưới sự kiểm soát của họ, chỉ cung cấp giao diện cho nó. Nghĩa vụ duy nhất họ có là bất cứ ai họ cung cấp các bản sao kỹ thuật số của dự án cũng phải được cung cấp nguồn.
Kent Fredric

1

$ dir = "Bạn nhập sai tên người dùng HOẶC mật khẩu"; $ responso = json_encode ($ tin nhắn);

echo "{\"status\" : \"400\", \"responce\" : \"603\", \"message\" : \"You Enter Wrong Username OR Password\", \"feed\":".str_replace("<p>","",$responso). "}";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.