Wie verwende ich cURL, um jSON-Daten abzurufen und die Daten zu dekodieren?


94

Ich habe also einen Link, der ein jSON-Objekt zurückgibt, und ich muss es dekodieren und in Variablen in PHP einfügen lassen.

URL

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

Dies ist das Objekt, das zurückgegeben wird

{
    "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": ""
                    }
                }
            }
        }
    }
}

Ich interessiere mich wirklich nur für die

"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,

und schließlich die Nachricht

[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]

Wie kann ich das jSON-Objekt extrahieren und es in korrekte Variablen in PHP einfügen, die ich später verwenden kann?

Variablen wie: $username, $user_id, $message, $title, $discussionState, und so weiter.

Ich muss nur wissen, wie ich das jSON-Objekt abrufen und dann die Daten in Variablen in PHP extrahieren kann.

Ich kann jetzt das PHP-Array abrufen, habe jedoch einige Probleme beim Aufrufen der richtigen Werte. Hier ist das Array.

Es ist schon eine Weile her, seit wir begonnen haben, die Phanime-Foren in die Hauptseite zu integrieren. Wir haben jetzt die Integration mit den Phanime-Foren und der Hauptseite abgeschlossen. Sie werden nicht mehr bemerken, dass auf zwei Plattformen Phanime ausgeführt wird, sondern nur auf einer. Unser nächster Schritt besteht darin, die Foren so zu gestalten, dass sie wie die Hauptseite aussehen! [ip_id] => 268 [message_state] => sichtbar [attach_count] => 0 [position] => 0 [liks] => 0 [like_users] => a: 0: {} [warning_id] => 0 [warning_message] =>))))))

Nehmen wir nun an, dieses Array wurde damals benannt $array, um den Wert des ersten Elements "[count]" zu erhalten. Kann ich nicht einfach Folgendes sagen: print $array["[count]"] <- Dies gibt einen Fehler zurück.

Was ist mit dem Element, das einen Wert als Array selbst hat, welches das [threads]Element ist? Wie bekomme ich vielleicht den [thread_id]Wert des Elements?

Antworten:


260

Ich denke, dieser wird Ihre Frage beantworten: 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";

Verwenden von 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));

Verwenden von file_get_contents

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

Zugriff

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

Und

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

1
Ich habe die Frage mit der kleinen Schwierigkeit aktualisiert, mit dem PHP-Array zu arbeiten, das von jSON zurückgegeben wird. Bitte lesen Sie den unteren Teil davon, wenn Sie können.
Maaz

Hallo! Ich komme dank Ihrer Antwort einem ähnlichen Problem nahe, stecke aber immer noch fest. Stört es Sie, einen Blick darauf zu werfen? stackoverflow.com/questions/28033267/…
Leon Gaban

Das stimmt. CURLOPT_RETURNTRANSFERgib mir das richtige Ergebnis (y) Danke!
Ariyandi

Nach stundenlangem Hinzufügen der Zeile // SSL-Überprüfung deaktivieren curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); gibt das Ergebnis zurück.
kta

10

Um das Objekt zu erhalten, das Sie nicht benötigen, müssen Sie eine einfache PHP-Datei_get_contents (url) verwenden. Funktion: http://il1.php.net/manual/en/function.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);

Dann analysiert json_decode () JSON in ein PHP-Objekt oder ein Array, wenn Sie truean den zweiten Parameter übergeben. http://php.net/manual/en/function.json-decode.php

Beispielsweise:

$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

Was ist mit der URL? Wie rufe ich das jSON-Objekt zuerst ab und setze es auf die Variable $ json? Die URL lautet: /api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=desc&limit=1&grab_content&content_limit=1 Gibt das jSON-Objekt zurück.
Maaz

1
Ich habe die Frage mit der kleinen Schwierigkeit aktualisiert, mit dem PHP-Array zu arbeiten, das von jSON zurückgegeben wird. Bitte lesen Sie den unteren Teil davon, wenn Sie können.
Maaz

Das ist falsch. Sie können keine URL an file_get_contents () übergeben ... es muss der Dateiname (Pfad) sein.
Henrik Petterson

@HenrikPetterson: file_get_contents kann absolut zum Abrufen einer URL verwendet werden, nicht nur lokaler Dateien. Obwohl cURL mehr Optionen bietet und wahrscheinlich eine bessere Option für alle außer den einfachsten Anwendungsfällen ist. Weitere Informationen finden
ineedhelp

7

Sie können dies für Curl verwenden:

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

Dann, um Json zu lesen:

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

Dann :

///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>";
           }

Sie können dies auch verwenden:

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

Hoffe das hat geholfen.


das hat mir geholfen. Aber ich musste $ data durch $ data ['result'] in den foreach-Eingaben in meinem Anwendungsfall ersetzen.
Eaweb


0

Sie können auch verwenden

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

-2

Sie können dies verwenden:

curl_setopt_array($ch, $options);
$resultado = curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info["url"]);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.