Trả về JSON từ tập lệnh PHP


877

Tôi muốn trả về JSON từ một tập lệnh PHP.

Tôi chỉ lặp lại kết quả? Tôi có phải đặt Content-Typetiêu đề không?

Câu trả lời:


1603

Mặc dù bạn thường ổn nếu không có nó, bạn có thể và nên đặt tiêu đề Kiểu nội dung:

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

Nếu tôi không sử dụng một khung cụ thể, tôi thường cho phép một số thông số yêu cầu sửa đổi hành vi đầu ra. Nói chung, nó có thể hữu ích để xử lý sự cố nhanh chóng, không gửi tiêu đề hoặc đôi khi print_r tải trọng dữ liệu đến nhãn cầu (mặc dù trong hầu hết các trường hợp, không cần thiết).


9
chỉ trong trường hợp: bạn chỉ nên sử dụng các lệnh tiêu đề () ngoài bộ đệm đầu ra để tránh các cảnh báo "tiêu đề đã được gửi"
Kevin

6
Tệp php phải được mã hóa bằng UTF-8 mà không cần BOM :)
Krzysztof Kalinowski

217
header('Content-type:application/json;charset=utf-8');
Timo Huovinen

14
@mikepote Tôi thực sự không nghĩ rằng cần phải có lệnh tiêu đề ở đầu tệp PHP. Nếu bạn vô tình phun ra các thứ và đó là vấp phải lệnh tiêu đề của bạn, bạn chỉ cần sửa mã của mình vì nó bị hỏng.
Halfstop

8
@KrzysztofKalinowski không, tệp PHP không cần phải được mã hóa UTF-8. đầu ra PHẢI được mã hóa UTF-8. Những tuyên bố sai đó không giúp người dùng không có kinh nghiệm học cách tránh những thứ bị phá vỡ, nhưng nó giúp phát triển những huyền thoại về họ và không bao giờ biết được vai trò nào mã hóa đóng vai trò trên luồng và cách họ làm việc.
Áxel Costas Pena

124

Một đoạn hoàn chỉnh của mã PHP đẹp và rõ ràng trả về JSON là:

$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

Theo hướng dẫn trênjson_encode phương thức có thể trả về một chuỗi không ( false ):

Trả về chuỗi được mã hóa JSON khi thành công hoặc FALSEthất bại.

Khi điều này xảy ra echo json_encode($data)sẽ xuất ra chuỗi rỗng, đó là JSON không hợp lệ .

json_encodechẳng hạn sẽ thất bại (và trả về false) nếu đối số của nó chứa chuỗi không UTF-8.

Điều kiện lỗi này cần được ghi lại trong PHP, ví dụ như thế này:

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

Sau đó, kết thúc nhận tất nhiên phải lưu ý rằng sự hiện diện của thuộc tính jsonError chỉ ra một điều kiện lỗi, cần xử lý theo đó.

Trong chế độ sản xuất, tốt hơn là chỉ gửi một trạng thái lỗi chung cho máy khách và ghi nhật ký các thông báo lỗi cụ thể hơn để điều tra sau.

Đọc thêm về cách xử lý các lỗi JSON trong Tài liệu của PHP .


2
Không có charsettham số nào cho JSON; xem ghi chú ở cuối công cụ.ietf.org/html/rfc8259#section-11 : "Không có tham số" ký tự "được xác định cho đăng ký này. Thêm một tham số thực sự không có tác dụng đối với người nhận tuân thủ." (JSON phải được truyền dưới dạng UTF-8 trên mỗi công cụ.ietf.org / html / rfc8259#section-8.1 , vì vậy, chỉ định rằng nó được mã hóa dưới dạng UTF-8 là một chút dư thừa.)
Patrick Dark

1
Cảm ơn vì đã nhấn mạnh điều đó, @PatrickDark. charsetTham số dự phòng được loại bỏ khỏi chuỗi tiêu đề HTTP.
trincot

38

Hãy thử json_encode để mã hóa dữ liệu và đặt loại nội dung với header('Content-type: application/json');.


15

Đặt loại nội dung với header('Content-type: application/json');và sau đó lặp lại dữ liệu của bạn.


12

Cũng tốt khi đặt bảo mật truy cập - chỉ cần thay thế * bằng tên miền bạn muốn có thể truy cập.

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

Dưới đây là nhiều mẫu hơn về điều đó: làm thế nào để bỏ qua Access-Control-Allow-Origin?


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

Sự khác biệt nêu rõ bộ ký tự trong tiêu đề là gì? Xin giải thích, cảm ơn.
Sanxofon

6

Như đã nói ở trên:

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

sẽ làm cho công việc. nhưng hãy nhớ rằng:

  • Ajax sẽ không gặp vấn đề gì khi đọc json ngay cả khi tiêu đề này không được sử dụng, ngoại trừ nếu json của bạn có chứa một số thẻ HTML. Trong trường hợp này, bạn cần đặt tiêu đề là application / json.

  • Đảm bảo tệp của bạn không được mã hóa trong UTF8-BOM. Định dạng này thêm một ký tự ở đầu tệp, vì vậy cuộc gọi tiêu đề () của bạn sẽ thất bại.


4

Một hàm đơn giản để trả về phản hồi JSON với mã trạng thái HTTP .

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_removevà thiết lập rõ ràng phản hồi http là một ý tưởng tốt; mặc dù thiết lập trạng thái và sau đó http_response có vẻ dư thừa. Cũng có thể muốn thêm một exittuyên bố vào cuối. Tôi đã kết hợp chức năng của bạn với @trincot 's: stackoverflow.com/a353391449/339440
Stephen R

Cám ơn vì sự gợi ý. Tôi vừa cập nhật câu trả lời.
Dan

3

Câu trả lời cho câu hỏi của bạn là ở đây ,

Nó nói rằng.

Loại phương tiện MIME cho văn bản JSON là application / json.

vì vậy nếu bạn đặt tiêu đề thành loại đó và xuất chuỗi JSON của bạn, nó sẽ hoạt động.


1

Vâng, bạn sẽ cần sử dụng echo để hiển thị đầu ra. Mimetype: ứng dụng / json


1

Nếu bạn cần lấy json từ php gửi thông tin tùy chỉnh, bạn có thể thêm thông tin này header('Content-Type: application/json');trước để in bất kỳ thứ gì khác, vì vậy sau đó bạn có thể in cho bạn tùy ýecho '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';


1

Nếu bạn truy vấn cơ sở dữ liệu và cần tập kết quả ở định dạng JSON thì có thể thực hiện như sau:

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

?>

Để được trợ giúp trong việc phân tích kết quả bằng jQuery, hãy xem hướng dẫn này .


1

Đây là một tập lệnh PHP đơn giản để trả về nam nữ và id người dùng vì giá trị json sẽ là bất kỳ giá trị ngẫu nhiên nào khi bạn gọi tập lệnh json.php.

Mong sự giúp đỡ này

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

Loại phương tiện MIME cho văn bản JSON là application / json
AA

0

Một cách dễ dàng để định dạng các đối tượng miền của bạn thành JSON là sử dụng Trình tuần tự Marshal . Sau đó chuyển dữ liệu đến json_encodevà gửi tiêu đề Kiểu nội dung chính xác cho nhu cầu của bạn. Nếu bạn đang sử dụng một khung như Symfony, bạn không cần phải chăm sóc cài đặt các tiêu đề theo cách thủ công. Ở đó bạn có thể sử dụng JsonResponse .

Ví dụ: Kiểu nội dung chính xác để xử lý Javascript sẽ là application/javascript.

Hoặc nếu bạn cần hỗ trợ một số trình duyệt cũ, an toàn nhất sẽ là text/javascript.

Đối với tất cả các mục đích khác như ứng dụng dành cho thiết bị di động, hãy sử dụng application/jsonlàm Kiểu nội dung.

Đây là một ví dụ nhỏ:

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

Bất cứ khi nào bạn đang cố gắng trả lại phản hồi JSON cho API hoặc nếu không, hãy đảm bảo bạn có các tiêu đề phù hợp và cũng đảm bảo bạn trả về dữ liệu JSON hợp lệ.

Đây là tập lệnh mẫu giúp bạn trả về phản hồi JSON từ mảng PHP hoặc từ tệp JSON.

Tập lệnh PHP (Mã):

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

Tệp 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}}"
        }
    ]
}

Screeshot JSON:

nhập mô tả hình ảnh ở đây


-1

Bạn có thể sử dụng cái này thư viện PHP nhỏ . Nó gửi các tiêu đề và cung cấp cho bạn một đối tượng để sử dụng nó một cách dễ dàng.

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