2016-04-25 59 views
0

我使用Slim php框架與包含複雜的HTML內容的數據庫,但是當調用get方法時,它返回一個壞的json。 這裏的返回碼PHP轉義JSON內的HTML字符串

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

我也試圖與json_encode但仍然無效:

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

我只注意到了JSON返回的缺少「}]」末,是有可能,內容太長而無法作爲字符串傳輸? 另外,當我打電話var_dump($resp)它正確顯示我的內容

+0

因爲它試圖將html編碼成字符串,所以html中的'''字符可能導致問題,請嘗試在$ $ response-> withJson();' 即類似'$ response-> withJson($ resp,201,JSON_HEX_QUOT);' – shamsup

+0

出於好奇...什麼是「返回一個壞的json」意思是什麼意思? –

+0

我們可以得到一個'$ resp '? – shamsup

回答

1

如果您在此時末尾缺少}],那麼您的一個PHP文件在打開<?php之前有兩個空格(或新行)。

另一種解決方案是你的$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. 
* 
* 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中的"字符可能會導致此問題。嘗試包括選項JSON_HEX_QUOT作爲第三個參數。

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

這將難逃在html爲Unicode文本\u0022,防止衝突的"字符。

+0

如果您瀏覽Slim源代碼,您會看到它沒有自己的JSON編碼器; 'withJson()'只不過是對本地'json_encode()'的調用 - 我可以從經驗中告訴你,它可以正確地工作,尤其是,與雙引號一樣簡單。 –

+0

我剛試過你的解決方案,但仍然是同樣的問題。 – aaa

+0

有可能是有其他事情導致他的問題,但沒有他轉換的例子,很難說。我以前用這個解決了JSON中的轉義問題,特別是使用雙引號和反斜槓。 – shamsup

0

你可能想要什麼。

  1. 渲染HTML可以通過使用slim/php-viewslim/twig-view
  2. 使用AJAX拉HTML並將其放置在您的移動應用。

使用JSON很愚蠢,因爲您仍然需要服務器端渲染HTML,然後將其打包成JSON格式。這樣做通常是一個壞主意,因爲規範中的JSON只接受UTF-8,並且沒有辦法解決這個問題。

+0

他可能需要包含元數據或者做一些簡單的事情,比如同時檢索多個項目(普通的HTML響應意味着每個項目有一個HTTP連接)。有一個乾淨的JSON API不一定是無稽之談。但除此之外,我認爲這應該是評論而不是回答。當你的代碼出現問題時,你只需修復它,而不是轉儲整個設計。 –