2013-05-17 40 views
14

Tôi đang phát triển một ứng dụng Android và cho API tôi gửi yêu cầu của mình đến một URL sẽ trả về dữ liệu JSON.Cách xuất dữ liệu JSON chính xác bằng cách sử dụng PHP

Đây là những gì tôi nhận được ở đầu ra của tôi: My response

Và tôi muốn nó sẽ được hiển thị như Twitter phản ứng:

Twitter's JSON response

Tôi giả định phản ứng của tôi là không được phân tích cú pháp bởi tiện ích mở rộng Định dạng JSON của Chrome vì nó được mã hóa nặng, do đó ứng dụng của tôi không thể nhận được các giá trị tôi cần.

Đây là mã PHP của tôi:

<?php 

$response = array(); 

if (isset($_POST['name']) && isset($_POST['price']) && isset($_POST['description'])) 
{ 

    $name = $_POST['name']; 
    $price = $_POST['price']; 
    $description = $_POST['decription']; 

    require_once __DIR__ . '/db_connect.php'; 

    $db = new DB_CONNECT(); 

    $result = mysql_query("INSER INTO products(name, price, description) VALUES('$name', '$price', '$description')"); 

    if ($result) { 
     $response["success"] = 1; 
     $response["message"] = "Product successfully created."; 

     echo json_encode($response); 
    } else { 

     $response["success"] = 0; 
     $response["message"] = "Oops! An error occurred!"; 

     echo json_encode($response); 
     } 
} else { 

    $response["success"] = 0; 
    $response["message"] = "Required field(s) is missing"; 

    echo json_encode($response); 

} 

?> 

Tôi muốn biết làm thế nào để hiển thị dữ liệu JSON một cách chính xác để JSON Formatter và App Android của tôi có thể phân tích nó một cách chính xác.

+0

lẽ là một typo nhưng truy vấn Insert của bạn bắt đầu với 'INSER'. – Orangepill

+0

Sẽ vô cùng hữu ích nếu bạn đăng kết quả JSON thực tế của mình, thay vì một hình ảnh. – Perception

+0

Tôi không quen thuộc với đầu ra JSON bằng PHP, nhưng tôi tò mò rằng tôi có thể thấy chức năng "thô" và "được phân tích cú pháp" trong ảnh chụp màn hình thứ hai của bạn, không phải là một số hàm javascript thực sự định dạng đầu ra? Vì vậy, nói rằng bạn làm một bản in đẹp, sẽ không làm tăng kích thước dữ liệu trang của bạn và nó không phải là những gì người dùng muốn? –

Trả lời

5

Hàm json_encode của PHP lấy đối số thứ hai, cho $options. Tại đây, bạn có thể sử dụng JSON_PRETTY_PRINT để in như bạn thấy trong Twitter API

Ví dụ:

echo json_encode($my_array, JSON_PRETTY_PRINT); 
3

Bạn có thể vượt qua một đối số cho hàm json_encode như thế này:

echo json_encode($response, JSON_PRETTY_PRINT); 

PHP 5.2.0 =>http://php.net/manual/en/function.json-encode.php

+1

Dường như, JSON_PRETTY_PRINT chỉ khả dụng trên PHP 5.4+ và máy chủ chạy 5.2. –

+0

Bạn nói đúng! Tôi đã tìm thấy lớp này PRETTY_JSON [http://pastebin.com/xB0fG9py] (http://pastebin.com/xB0fG9py). Tôi đã không thử nghiệm nó nhưng bạn có thể lấy cảm hứng từ cái này. – Strategio

0

phản ứng JSON của bạn đã nằm trong tình trạng tốt. Phản hồi bạn đang xem nằm trong trình duyệt Chrome. Đó là lý do tại sao nó trông như thế. Nếu bạn thêm dòng dưới đây vào mã yoru

var_dump($response); và sau đó nhấp chuột phải -> xem nguồn trong chrome brower, bạn sẽ thấy cấu trúc cây. Dù sao bạn có thể sao chép phản hồi JSON của mình và kiểm tra tính hợp lệ here

Điều tương tự tôi thấy trước tiên khi tôi thấy nó trong chrome. Nó cũng xảy ra với tôi.

1

JSON của bạn phải giống như hình ảnh đầu tiên của bạn; Tất cả trong một dòng squished với nhau. Bạn có thể chuyển đầu ra của bạn tới jsonlint.com, điều này có thể giúp bạn tìm thấy dữ liệu lỗi/lỗi chính tả của mình. TẤT CẢ các câu trả lời khác hiện tại cũng có thể giúp bạn giải quyết vấn đề của mình. tất cả đều cung cấp cho bạn các tùy chọn khác nhau để định dạng đầu ra của bạn nếu bạn thực sự muốn làm điều đó.

Đây là một cách khác để bạn hiển thị JSON của mình bằng HTML.

Nếu bạn đưa phản hồi của mình vào HTML < trước> thẻ, bạn sẽ giữ định dạng khoảng trắng.

Ví dụ, tôi sử dụng jQuery để có được một số dữ liệu json và trong jQuery lấy đối tượng json và đặt nó trực tiếp trong một pre <> đó là định dạng

<pre class="output" style="text-align:left; width:80%; margin:0 auto">[ results ]</pre> 

tôi sử dụng

$('.output').html(JSON.stringify(data,null,4)); 

này sẽ lấy lại json của bạn, định dạng nó bằng dấu cách với HTML < trước> có thể sử dụng để định dạng nó như bạn muốn xem.

Nếu bạn muốn có màu json của bạn được mã hóa ... bạn có thể sử dụng http://prismjs.com/ hoặc bất kỳ hệ thống nổi bật khác ...

16

Vấn đề của bạn là thực sự rất dễ dàng để giải quyết. Plugin Trình định dạng JSON của Chrome chỉ định dạng đầu ra của bạn nếu tiêu đề Kiểu nội dung được đặt thành ứng dụng/json.

Điều duy nhất bạn cần thay đổi trong mã của mình là sử dụng header('Content-Type: application/json'); trong mã PHP của bạn, trước khi trả lại dữ liệu được mã hóa bằng json.

+2

Tôi biết câu hỏi cụ thể tiểu bang chrome vv, nhưng tôi thấy rằng để có được điều này để làm việc trong FF, tôi đã phải sử dụng 'header ('Content-Type: application/json');' thay vì 'header ('Content-Type ',' application/json '); '(thay thế dấu phẩy bằng dấu hai chấm) – Programster

+0

Có, tôi đã đánh máy. Tôi chỉ nhận thấy ngay bây giờ. Cảm ơn! ;) –

+1

@OscarSwanros, bạn có thể gắn cờ vấn đề này được giải quyết không? Cảm ơn! :) –

0

chỉ Thêm Tag pre ->

<pre><?php ---you`r code---  ?> </pre> 

echo json_encode($response, JSON_PRETTY_PRINT); 

sau khi thêm pre-Tag và JSON_PRETTY_PRINT tôi chắc chắn rằng vấn đề của bạn sẽ giải quyết.

0

Laravel

Thiết tiêu đề header('Content-Type: application/json'); hoặc json PRETTY_PRINT đã không làm việc?

Một chút css là những gì bạn cần white-space: pre-wrap;

Bạn đang bán phá giá json đến một trang trống từ điều khiển hoặc router?

Route::get('/print-json', function (Request $request) { 
    echo '<style>body{ white-space: pre-wrap; }</style>'; 
    echo json_encode([ 
     'IP' => $request->getClientIp(), 
     'Route' => $request->route(), 
    ], JSON_PRETTY_PRINT); 
}); 

Output:

{ 
    "IP": "127.0.0.1", 
    "Route": { 
     "uri": "showArray", 
     "methods": [ 
      "GET", 
      "HEAD" 
     ], 
     "action": { 
      "middleware": "web", 
      "uses": {}, 
      "namespace": "App\\Http\\Controllers", 
      "prefix": null, 
      "where": [] 
     }, 
     "isFallback": false, 
     "controller": null, 
     "defaults": [], 
     "wheres": [], 
     "parameters": [], 
     "parameterNames": [], 
     "computedMiddleware": [ 
      "web" 
     ], 
     "compiled": {} 
    } 
} 
Các vấn đề liên quan