1

次のコードを使用して 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;
}

?>
4

1 に答える 1

1

消費者を保護するために、json string {"0":null,"1":" 0"}で文字通り「null」という単語を返す場合は、文字列の置換を実行して、パターン null を「」に置き換えます。

 $payload = file_get_contents('php://input');
 $payload = str_replace(' null ', '""', $payload);
 return json_decode($payload, true);

結果として「null」が含まれないように send_response() を修正するには、次のいずれかにエンコードする前に配列を反復処理できます。

  1. null を空の文字列に変更します。
  2. null を指すインデックスを削除する

私はナンバー1が好きです:

function send_response($data) {
    foreach($data as $key=>$value){
           $data[$key] = is_null($value) ? '' : $value;
    }
    $response = json_encode($data, JSON_FORCE_OBJECT);
    header('Content-Type: application/json');
    header('Content-Length: ' . strlen($response));
    echo $response;
    exit;
}
于 2013-08-09T13:29:04.127 に答える