2016-04-25 11 views
0

私は複雑なHTMLコンテンツを含むデータベースでSlim PHPフレームワークを使用していますが、getメソッドを呼び出すと悪いjsonを返します。 ここでリターンコードPHP JSONの中でhtml文字列をエスケープする

$response->withJson($resp, 201); 

は私もjson_encodeと試みたが、まだ有効ではありません:、最後に「]}」不足している私はJSONを返すことに気づい

$response->withJson(json_encode($resp), 201); 

ことが可能ですコンテンツが文字列として転送するには長すぎますか? var_dump($resp)と私のコンテンツが正しく表示されます。

+0

htmlを文字列にエンコードしようとしているため、htmlの '' '文字が問題の原因になっている可能性があります。' $ response-> withJson();の$ encodingOptionsパラメータに 'JSON_HEX_QUOT'オプションを含めてみてください。 '$ response-> withJson($ resp、201、JSON_HEX_QUOT);のようなものです。 – shamsup

+0

好奇心から...「悪いjsonを返す」とはどういう意味ですか? –

+0

' $ resp '? – shamsup

答えて

1

最後に}]が見つからない場合は、PHPファイルの1つに、開封<?phpの前に空白(または改行)が2つあります。

別の解決策は、あなたが$app->run()に置き換えることです。うまくいけば

$response = $app->run(true); //Silent mode, wont send the response 
$response = $response->withoutHeader("Content-Length"); //Remove the Content-Length 
$app->respond($response); //Now we send the response 

、我々は次のバージョンで適切な修正を持っていますよ!

+0

かなり良い点。好奇心の念から、ブラウザのネットワークペインに完全な応答が表示されるか、完全に破棄されますか? –

+0

私は知らない - 私はカールを使用する傾向がある! –

0

文字のコード化に問題がある可能性があります。あなたはこれを試しましたか?

json_encode($array, JSON_UNESCAPED_UNICODE) 

Any way to return PHP `json_encode` with encode UTF-8 and not Unicode?

+0

So ... Slimコアにパッチを適用して、生のUTF-8文字(プレーン7ビットASCIIではなく)を注入すると「bad JSON」が修正されますか?どのくらい正確に? –

0

私の知る限り、スリムは、エラーチェックをやって気にしない:

/** 
* Json. 
* 
* Note: This method is not part of the PSR-7 standard. 
* 
* This method prepares the response object to return an HTTP Json 
* response to the client. 
* 
* @param mixed $data The data 
* @param int $status The HTTP status code. 
* @param int $encodingOptions Json encoding options 
* @return self 
*/ 
public function withJson($data, $status = 200, $encodingOptions = 0) 
{ 
    $body = $this->getBody(); 
    $body->rewind(); 
    $body->write(json_encode($data, $encodingOptions)); 

    return $this->withStatus($status)->withHeader('Content-Type', 'application/json;charset=utf-8'); 
} 

...そう、あなたはそれを自分で行う必要があります。最小値はjson_last_error()への呼び出しです。

0

htmlをJSONの文字列にエンコードしようとしているため、htmlの"文字が問題の原因になっている可能性があります。 3番目のパラメータとしてJSON_HEX_QUOTオプションを含めてみてください。

$response->withJson($resp,201,JSON_HEX_QUOT); 

これは、衝突を防止すること、\u0022リテラルunicodeにHTMLで"文字をエスケープします。

+0

Slimソースコードを閲覧すると、独自のJSONエンコーダがないことがわかります。 'withJson()'は自然な 'json_encode()'を呼び出すものに過ぎません。二重引用符のような単純なもので。 –

+0

私はちょうどあなたの解決策を試しましたが、同じ問題が残っています。 – aaa

+0

彼の問題を引き起こしている何かがある可能性がありますが、彼が何を変換しているかの例がなければ、それを伝えるのは難しいです。以前はJSONのエスケープ問題、特に二重引用符とバックスラッシュを解決するためにこれを使用しました。 – shamsup

0

可能性が高いものHTMLのレンダリング

  1. は、HTMLを引き、あなたのモバイルアプリでそれを置くためにslim/php-viewまたはslim/twig-view
  2. 使用AJAXを使用することにより可能です。

JSONを使用すると、サーバー側でHTMLをレンダリングしてから、JSON形式にパッケージ化する必要があるため、愚かです。 JSONの仕様ではUTF-8しか受け入れられないため、これを回避する方法はないため、これは一般的には悪い考えです。

+0

彼はメタデータを含めたり、複数のアイテムを同時に取得するといった単純な操作を行う必要があります(単純なHTML応答はアイテムごとに1つのHTTP接続を意味します)。きれいなJSON APIを持つことは必ずしもナンセンスではありません。しかしそれとは別に、私はこれが答えではなくコメントとして掲示されているべきだと思います。コードに問題がある場合は、ただ修正し、デザイン全体をダンプしないでください。 –

関連する問題