Làm cách nào để sử dụng cURL để lấy dữ liệu jSON và giải mã dữ liệu?


95

Vì vậy, tôi có một liên kết trả về một đối tượng jSON và tôi cần giải mã nó và đưa vào các biến trong PHP.

URL

api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=desc&limit=1&grab_content&content_limit=1

Đây là đối tượng mà nó trả về

{
    "count": 1,
    "threads": {
        "38752": {
            "thread_id": 38752,
            "node_id": 4,
            "title": "The ShadyCraft Beta Launch!",
            "reply_count": 45,
            "view_count": 946,
            "user_id": 2,
            "username": "Shady",
            "post_date": 1366956695,
            "sticky": 0,
            "discussion_state": "visible",
            "discussion_open": 1,
            "discussion_type": "",
            "first_post_id": 226167,
            "first_post_likes": 7,
            "last_post_date": 1369094302,
            "last_post_id": 228226,
            "last_post_user_id": 2,
            "last_post_username": "Shady",
            "prefix_id": 19,
            "tinhte_xentag_tags": "a:4:{i:0;s:9:\"minecraft\";i:2;s:4:\"news\";i:3;s:14:\"private server\";i:1;s:10:\"shadycraft\";}",
            "content": {
                "count": 1,
                "content": {
                    "226167": {
                        "post_id": 226167,
                        "thread_id": 38752,
                        "user_id": 2,
                        "username": "Shady",
                        "post_date": 1366956695,
                        "message": "[ATTACH=full]4143[\/ATTACH]\n \nWe've completely restructured ShadyCraft, and today will be the launch of the ShadyCraft beta.\n \nCurrent Features\n[LIST]\n[*]Towns\n[*]Nations\n[*]All out wars\n[*]A live update map\n[*]No White-list\n[*]Earn Money\n[*]Griefing allowed where possible\n[\/LIST]\nThese are just some features which have a lot more things behind them. For instance, there is town and nation upkeep, tax, kingdoms, mayors, and kings.\n \nWe really wanted to have the server self-governed and this is why griefing and PvP are allowed where ever they are possible. All towns and nations cannot be griefed by other members. You can create a town and buy plots for it and expand the town as you wish.\n \n[SIZE=4]All of this is shown in the live updating map located [URL='http:\/\/50.7.6.116:8123']here[\/URL].[\/SIZE]\n \n[SIZE=4][SIZE=6]Join the Beta Now[\/SIZE][\/SIZE]\n[SIZE=6]Server-IP: 50.7.6.116[\/SIZE]\n \n \n[USER=118053]Frenchy[\/USER] and [USER=4863]Wolfbane[\/USER]",
                        "ip_id": 747429,
                        "message_state": "visible",
                        "attach_count": 1,
                        "position": 0,
                        "likes": 7,
                        "like_users": "a:5:{i:0;a:2:{s:7:\"user_id\";i:105699;s:8:\"username\";s:6:\"kvothe\";}i:1;a:2:{s:7:\"user_id\";i:146724;s:8:\"username\";s:12:\"Graveyard219\";}i:2;a:2:{s:7:\"user_id\";i:70182;s:8:\"username\";s:9:\"wmbrown18\";}i:3;a:2:{s:7:\"user_id\";i:5473;s:8:\"username\";s:9:\"Oblivious\";}i:4;a:2:{s:7:\"user_id\";i:118053;s:8:\"username\";s:7:\"Frenchy\";}}",
                        "warning_id": 0,
                        "warning_message": "",
                        "anonymous_posting_real_user_id": 0,
                        "anonymous_posting_real_username": ""
                    }
                }
            }
        }
    }
}

Tôi thực sự chỉ quan tâm đến

"title":"The ShadyCraft Beta Launch!",  
"reply_count:"45, 
"view_count": 946,  
"user_id":2, 
"username":"Shady", 
"post_date":1366956695, 
"sticky":0, 
"discussion_state":"visible",
"discussion_open":1,

và cuối cùng là tin nhắn

[ATTACH=full]4143[/ATTACH]

We've completely restructured ShadyCraft, and today will be the launch of the ShadyCraft beta.

Current Features
[LIST]
[*]Towns
[*]Nations
[*]All out wars
[*]A live update map
[*]No White-list
[*]Earn Money
[*]Griefing allowed where possible
[/LIST]
These are just some features which have a lot more things behind them. For instance, there is town and nation upkeep, tax, kingdoms, mayors, and kings.

We really wanted to have the server self-governed and this is why griefing and PvP are allowed where ever they are possible. All towns and nations cannot be griefed by other members. You can create a town and buy plots for it and expand the town as you wish.

[SIZE=4]All of this is shown in the live updating map located [URL='http://50.7.6.116:8123']here[/URL].[/SIZE]

[SIZE=4][SIZE=6]Join the Beta Now[/SIZE][/SIZE]
[SIZE=6]Server-IP: 50.7.6.116[/SIZE]


[USER=118053]Frenchy[/USER] and [USER=4863]Wolfbane[/USER]

Vậy làm cách nào để tôi có thể giải nén đối tượng jSON và đưa nó vào để sửa các biến trong PHP, để sau này tôi có thể sử dụng?

Biến như: $username, $user_id, $message, $title, $discussionState, và vân vân.

Tôi chỉ cần biết cách tôi có thể truy xuất đối tượng jSON, sau đó trích xuất dữ liệu thành các biến trong PHP.

Bây giờ tôi có thể lấy mảng PHP, nhưng tôi gặp một số khó khăn khi gọi các giá trị chính xác. Đây là mảng.

đã được một thời gian kể từ khi chúng tôi bắt đầu tích hợp Diễn đàn phanime với trang web chính. Hiện chúng tôi đã hoàn thành việc tích hợp với Diễn đàn phanime và trang web chính. Bạn sẽ không còn nhận thấy rằng có hai nền tảng đang chạy phanime, mà thay vào đó chỉ có một. Bước tiếp theo của chúng tôi là tạo chủ đề cho các diễn đàn để làm cho nó giống như trang web chính! [ip_id] => 268 [message_state] => hiển thị [đính kèm_count] => 0 [vị trí] => 0 [lượt thích] => 0 [lượt thích] => a: 0: {} [warning_id] => 0 [warning_message] =>))))))

Bây giờ giả sử mảng này đã được đặt tên $arraysau đó để nhận giá trị của phần tử đầu tiên "[count]", tôi không thể chỉ nói như sau: print $array["[count]"] <- điều này trả về một lỗi.

Còn phần tử có giá trị là một mảng chính là [threads]phần tử. Làm cách nào để nhận, có lẽ [thread_id]là giá trị của phần tử?

Câu trả lời:


266

Tôi nghĩ cái này sẽ trả lời câu hỏi của bạn: P

$url="https://.../api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=‌​desc&limit=1&grab_content&content_limit=1";

Sử dụng cURL

//  Initiate curl
$ch = curl_init();
// Will return the response, if false it print the response
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Set the url
curl_setopt($ch, CURLOPT_URL,$url);
// Execute
$result=curl_exec($ch);
// Closing
curl_close($ch);

// Will dump a beauty json :3
var_dump(json_decode($result, true));

Sử dụng file_get_contents

$result = file_get_contents($url);
// Will dump a beauty json :3
var_dump(json_decode($result, true));

Truy cập

$array["threads"][13/* thread id */]["title"/* thread key */]

$array["threads"][13/* thread id */]["content"/* thread key */]["content"][23/* post id */]["message" /* content key */];

1
Tôi đã cập nhật câu hỏi với một khó khăn nhỏ mà tôi đang gặp phải khi làm việc với mảng PHP được trả về bởi jSON. Vui lòng đọc phần dưới cùng của nó nếu bạn có thể.
Maaz

Chào! Tôi đang giải quyết một vấn đề tương tự nhờ câu trả lời của bạn, nhưng vẫn còn mắc kẹt ở vấn đề, bạn có phiền vui lòng xem qua không? stackoverflow.com/questions/28033267/…
Leon Gaban

Đúng rồi. CURLOPT_RETURNTRANSFERcho tôi kết quả đúng (y) Cảm ơn!
ariyandi

Sau hàng giờ, thêm dòng // Tắt xác minh SSL curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); trả về kết quả.
kta

10

để lấy đối tượng mà bạn không cần sử dụng cURL (bạn đang tải một dll khác vào bộ nhớ và có một phụ thuộc khác, trừ khi bạn thực sự cần curl, tôi sẽ gắn bó với các hàm php tích hợp sẵn), bạn có thể sử dụng một php file_get_contents (url) đơn giản chức năng: http://il1.php.net/manual/en/ Chức năng.file-get-contents.php

$unparsed_json = file_get_contents("api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=desc&limit=1&grab_content&content_limit=1");

$json_object = json_decode($unparsed_json);

thì json_decode () phân tích cú pháp JSON thành một đối tượng PHP hoặc một mảng nếu bạn truyền truecho tham số thứ hai. http://php.net/manual/en/ Chức năng.json-decode.php

Ví dụ:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));           // Object
var_dump(json_decode($json, true));     // Associative array

Điều gì về url? Làm cách nào để truy xuất đối tượng jSON ngay từ đầu và đặt nó thành biến $ json? Url là: Trả /api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=desc&limit=1&grab_content&content_limit=1 về đối tượng jSON.
Maaz

1
Tôi đã cập nhật câu hỏi với một khó khăn nhỏ mà tôi đang gặp phải khi làm việc với mảng PHP được trả về bởi jSON. Vui lòng đọc phần dưới cùng của nó nếu bạn có thể.
Maaz

Điều này là không chính xác. Bạn không thể chuyển một URL đến file_get_contents () ... nó phải là tên tệp (đường dẫn).
Henrik Petterson

@HenrikPetterson: file_get_contents hoàn toàn có thể được sử dụng để tìm nạp một URL, không chỉ các tệp cục bộ. Mặc dù cURL cung cấp nhiều tùy chọn hơn và có lẽ là một lựa chọn tốt hơn cho tất cả trừ các trường hợp sử dụng đơn giản nhất. Đánh dấu vào đây để biết thêm: php.net/manual/en/function.file-get-contents.php
ineedhelp

7

Bạn có thể sử dụng cái này cho Curl:

function fakeip()  
{  
    return long2ip( mt_rand(0, 65537) * mt_rand(0, 65535) );   
}  

function getdata($url,$args=false) 
{ 
    global $session; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: ".fakeip(),"X-Client-IP: ".fakeip(),"Client-IP: ".fakeip(),"HTTP_X_FORWARDED_FOR: ".fakeip(),"X-Forwarded-For: ".fakeip())); 
    if($args) 
    { 
        curl_setopt($ch, CURLOPT_POST, 1); 
        curl_setopt($ch, CURLOPT_POSTFIELDS,$args); 
    } 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    //curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:8888"); 
    $result = curl_exec ($ch); 
    curl_close ($ch); 
    return $result; 
} 

Sau đó để đọc Json:

$result=getdata("https://example.com");

Sau đó :

///Deocde Json
$data = json_decode($result,true);
///Count
             $total=count($data);
             $Str='<h1>Total : '.$total.'';
             echo $Str;
//You Can Also Make In Table:
             foreach ($data as $key => $value)
              {
          echo '  <td><font  face="calibri"color="red">'.$value[type].'   </font></td><td><font  face="calibri"color="blue">'.$value[category].'   </font></td><td><font  face="calibri"color="green">'.$value[amount].'   </font></tr><tr>';

           }
           echo "</tr></table>";
           }

Bạn cũng có thể sử dụng cái này:

echo '<p>Name : '.$data['result']['name'].'</p>
      <img src="'.$data['result']['pic'].'"><br>';

Hy vọng điều này sẽ giúp.


điều này đã giúp tôi. nhưng tôi đã phải thay thế $ data bằng $ data ['result'] trong các đầu vào foreach trong trường hợp sử dụng của mình.
Eaweb


0

bạn cũng có thể dùng

$result = curl_exec($ch);
return response()->json(json_decode($result));

-2

Bạn có thể sử dụng cái này:

curl_setopt_array($ch, $options);
$resultado = curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info["url"]);
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.