次のコードを使用して JSON を解析していますが、予期しない JSON の結果が得られ続けています。
もともとはhere$status
からのものですが、57行目は配列ではなく、配列ではないという事実に関連するエラーをスローしていたため、そのコードを機能させることができません$status
でした:
チェックを追加して修正しました:
56 if (is_array($status)) {}
コードは正常に実行されますが、返される JSON は次のとおりです。
{"0":null,"1":" 0"}
これが正しくないことはわかっています。Pebble Watch でアプリケーションを実行する0
と、適切なデータを表示するためのものであり、 内に何もないため明らかに失敗するからです。
私が知る限り、次のコードは$order
代わりに挿入する必要がありますが、何らかの理由でnull
常に代わりに返されます。null
35 // Grab the tube status and the incoming payload.
36 $tube_data = json_decode(file_get_contents($API_URL), true);
37 $payload = get_payload();
38
39 $order = $payload['0'];
40
41 // Start building the response.
42 $response = array(
43 '0' => $order,
44 '1' => ''
45 );
どんな助けでも大歓迎です、そして前もって感謝します。
完全なコード (utils を含む) は次のとおりです。
main.php
1 <?php
2
3 // Include my shared functions.
4 include_once($_SERVER['DOCUMENT_ROOT'] . '/utils.php');
5
6 // The URL of the Tube Status API.
7 $API_URL = 'http://api.tubeupdates.com/?method=get.status&format=json';
8
9 // Mapping between shortcode and line name.
10 $line_codes = array(
11 'BL' => 'bakerloo',
12 'CE' => 'central',
13 'CI' => 'circle',
14 'DI' => 'district',
15 'DL' => 'docklands',
16 'HC' => 'hammersmithcity',
17 'JL' => 'jubilee',
18 'ME' => 'metropolitan',
19 'NO' => 'northern',
20 'OV' => 'overground',
21 'PI' => 'piccadilly',
22 'VI' => 'victoria',
23 'WC' => 'waterloocity'
24 );
25
26 // Mapping between errors and numbers
27 $statuses = array(
28 'good service' => 1,
29 'part closure' => 2,
30 'minor delays' => 4,
31 'severe delays' => 8,
32 'part suspended' => 16
33 );
34
35 // Grab the tube status and the incoming payload.
36 $tube_data = json_decode(file_get_contents($API_URL), true);
37 $payload = get_payload();
38
39 $order = $payload['0'];
40
41 // Start building the response.
42 $response = array(
43 '0' => $order,
44 '1' => ''
45 );
46
47 // Split the ordering string into the 2 character line short codes.
48 $lines = str_split($order, 2);
49 foreach ($lines as $pos => $line) {
50
51 // Get the status for the line given its short code.
52 $status = get_status_by_id($line_codes[$line]);
53
54 // Do bitwise ORs on the status number to build it up
55 $status_number = 0;
56 if (is_array($status)) {
57 foreach ($status as $st) {
58 $status_number = $status_number |= $statuses[$st];
59 }
60 }
61
62 // Append the status code to the response string.
63 $response['1'] .= str_pad($status_number, 2, ' ', STR_PAD_LEFT);
64 }
65
66 // Send the response.
67 send_response($response);
68
69 // Takes a line code (not shortcode) and returns an array of its current status.
70 function get_status_by_id($id) {
71 global $tube_data;
72
73 foreach ($tube_data['response']['lines'] as $index => $line) {
74 if ($line['id'] == $id) {
75 return explode(', ', $line['status']);
76 }
77 }
78 return NULL;
79 }
80
81 ?>
utils.php
<?php
function get_payload() {
return json_decode(file_get_contents('php://input'), true);
}
function send_response($data) {
$response = json_encode($data, JSON_FORCE_OBJECT);
header('Content-Type: application/json');
header('Content-Length: ' . strlen($response));
echo $response;
exit;
}
?>