web-dev-qa-db-ja.com

phpJSON_encodeが機能しない

this からJSON出力を取得したい this 。残念ながら、json_encode()関数は配列をその形式にエンコードしません。何も戻ってこない。これが私のコードです。`

$output = array(
    'responseData' => array(),
    'responseDetails' => null,
    'responseStatus' => 200
);

$x = 0;
while ($row = mysqli_fetch_assoc($result)) {
    foreach ($row as $k => $v) {
        $output['responseData']['result'][$x][$k] = $v;
    }
    $x++;
}

print_r($output);
header('Content-Type: application/json');
echo json_encode($output , JSON_FORCE_OBJECT);

理由がわかりません。誰かが私が解決策を見つけるのを手伝ってください。

編集:ごめんなさい。ここに出力があります-

期待されるJSON出力-

{
"responseData": {
    "results": [{
        "qid": 1,
        "qtitle": "When do we finish this project ?",
        "qimage_url": "http://www.wearesliit.com/example.png",
        "user": "samith",
        "date": "2016-01-01T02:15:12.356Z",
        "type": 1,
        "category": 5,
        "tags": ["common_senese", "truth", "bazsa_awsanna"],
        "note": "Sample quetion"
    }, {}, {}]
},
"responseDetails": null,
"responseStatus": 200 }

JSON出力がまったく得られません。しかし、これが配列のprint_rの結果です。

 Array(
[responseData] => Array
    (
        [result] => Array
            (
                [0] => Array
                    (
                        [question_ID] => 1
                        [question_Title] => Which shape does not belong with the other three shapes?
                        [question_Image_URL] => http://www.wearesliit.com/images/quiz/questions/1.jpg
                        [quetion_Note] => Easy IQ question.
                        [category_ID] => 7
                        [username] => samith
                        [added] => 2017-01-29 21:50:52
                    )

                [1] => Array
                    (
                        [question_ID] => 2
                        [question_Title] => Tim earns $10 per hour at his job.  When he gets paid on Friday, he is paid for 40 hours of work.  He then goes out and spends 10% of his earnings on entertainment that weekend.  How much money is he left with on Monday?
                        [question_Image_URL] => 
                        [quetion_Note] => Easy IQ question.
                        [category_ID] => 7
                        [username] => samith
                        [added] => 2017-01-29 21:50:52
                    )
            )

    )

[responseDetails] => 
[responseStatus] => 200 )
5
Samith Dilshan

@awiebeのおかげで、正確なエラーが見つかりました。それは

不正な形式のUTF-8文字、おそらく正しくエンコードされていない

みなさん、ありがとうございました。別の質問から解決策を見つけました。 'Laravelで'不正なUTF-8文字、おそらく正しくエンコードされていません '

9
Samith Dilshan

json_encode()関数は、エンコードが失敗し、「false」の結果がエコーまたは出力に表示されない場合に「false」を返します。参照: http://php.net/manual/en/function.json-encode.php このような問題を処理する最良の方法は、json_last_error_msg()メソッドを使用し、に従ってアクションを実行することです。エラーが見つかりました。参照: http://php.net/manual/en/function.json-last-error-msg.php 。例は次のとおりです。

$show_json = json_encode($output , JSON_FORCE_OBJECT);
if ( json_last_error_msg()=="Malformed UTF-8 characters, possibly incorrectly encoded" ) {
    $show_json = json_encode($API_array, JSON_PARTIAL_OUTPUT_ON_ERROR );
}
if ( $show_json !== false ) {
    echo($show_json);
} else {
    die("json_encode fail: " . json_last_error_msg());
}

問題がエンコード文字である場合、それは表示されません。文字が作業に不可欠ではないことを願うか、ジガジリオンの文字列リストで不一致の入力を見つけた場合は、それを修正してください。他のタイプのエラーはここで見つけることができます: http://php.net/manual/en/json.constants.php 。見つけたエラーに対してifステートメントと修正を適用するだけです。

これが誰かに役立つことを願っています。

5
Volfegan

削除する

header('Content-Type: application/json');

通常のHTMLタグ、ファイル内の空白行、またはPHPのいずれかによって、実際の出力を送信する前に、header()を呼び出す必要があることに注意してください。 include、require、関数、または別のファイルアクセス関数を使用してコードを読み取り、header()が呼び出される前にスペースまたは空の行が出力されることは非常に一般的なエラーです。単一のPHP/HTMLファイルを使用する場合にも同じ問題が存在します。

およびJSON_FORCE_OBJECTから

echo json_encode($output , JSON_FORCE_OBJECT);
0
Hedin

この問題について、 link で紹介したいと思います。次のようなjson_encodeラッパーを使用することをお勧めします。

function safe_json_encode($value){
if (version_compare(PHP_VERSION, '5.4.0') >= 0) {
    $encoded = json_encode($value, JSON_PRETTY_PRINT);
} else {
    $encoded = json_encode($value);
}
switch (json_last_error()) {
    case JSON_ERROR_NONE:
        return $encoded;
    case JSON_ERROR_DEPTH:
        return 'Maximum stack depth exceeded'; // or trigger_error() or throw new Exception()
    case JSON_ERROR_STATE_MISMATCH:
        return 'Underflow or the modes mismatch'; // or trigger_error() or throw new Exception()
    case JSON_ERROR_CTRL_CHAR:
        return 'Unexpected control character found';
    case JSON_ERROR_SYNTAX:
        return 'Syntax error, malformed JSON'; // or trigger_error() or throw new Exception()
    case JSON_ERROR_UTF8:
        $clean = utf8ize($value);
        return safe_json_encode($clean);
    default:
        return 'Unknown error'; // or trigger_error() or throw new 
Exception();
}
}


function utf8ize($mixed) {
if (is_array($mixed)) {
    foreach ($mixed as $key => $value) {
        $mixed[$key] = utf8ize($value);
    }
} else if (is_string ($mixed)) {
    return utf8_encode($mixed);
}
return $mixed;
}

そして、これらの関数を定義した後、直接使用できます。

echo safe_json_encode($response);
0
Elia Weiss