5

PHP(5.3.1)でJSON文字列をWebサービス(Python)に送信する必要があるプロジェクトに取り組んでいますが、json_encodeから取得した結果が有効なJSONとして渡されません(JSLintを使用しています)有効性を確認するため)。

エンコードしようとしている構造はかなり大きく(13Kエンコード)、部分的にUTF8データで構成されており、json_encodeはそれを処理しますが、結果の奇妙な場所にスペースが入ります。たとえば、{"hello":true}または{"hello":true}を取得すると、JSONが無効であるため(または2番目の例のようにデータ)、Webサービスからエラーが発生します。

また、JSONエンコーディングにZendフレームワークを使用しようとしましたが、それほど違いはありませんでした。

PHPのJSONに既知の問題はありますか?誰かがその行動に遭遇し、解決策を見つけましたか?

4

4 に答える 4

7

あなたは「私がエンコードしようとしている構造は...部分的にUTF8データで構成されている」と述べています。これは、部分的に非UTF8データでもあることを意味します。json_encodeドキュメントの下部にコメントがあります

json_encode()は、文字列がUTF8形式でエンコードされることを想定していますが、デフォルトでは、PHP文字列はISO-8859-1でエンコードされています。この意味は

json_encode(array('àü'));

空の文字列のjson表現を生成しますが、

json_encode(array(utf8_encode('àü')));

動作します。

非UTF8入力が原因でJSONのセグメントが失敗していませんか?

于 2009-11-24T14:41:18.510 に答える
6

オブジェクトキーにスペースやUnicode以外の文字を含めることはできません。引用符で囲まれていない変数は、ブール値、整数、浮動小数点数、オブジェクト、および配列の値のみにすることができます。文字列は常に引用符で囲む必要があります。

また、json出力の前に正しいヘッダーを追加することをお勧めします。

if(!headers_sent())
   header('Content-Type: application/json; charset=utf-8', true,200);

渡す配列またはオブジェクトを投稿することもできますjson_encodeか?

于 2009-11-24T14:34:27.320 に答える
3

先日、自動生成された電子メールを処理していて、同じ奇妙な動作(電子メールの本文にスペースが挿入されている)に気付いたので、電子メールの投稿を確認し始め、原因を見つけました。

SMTP RFC2821から:

を含むテキスト行の最大全長は1000文字です(透明性のために複製された先頭のドットはカウントされません)。

私のメール本文は確かに1行だったので、\nで分割するとスペースの問題が修正されました。

于 2010-10-14T12:21:43.540 に答える
1

ほぼ1日頭を悩ませた後、問題はjson_encode関数にあるのではないという結論に達しました。それは私のポスト機能でした。

基本的に、json_encodeは別のサービスに送信するデータを準備していました。今日まで、stream_context_createとfopenを使用してデータを外部サービスに投稿していましたが、現在はfsockopenとfputsを使用しており、機能しているようです。

問題の性質についてはよくわかりませんが、問題が解決したことをうれしく思います:)

ところで:このプロセスの後、私は自分自身に入力と出力(両方ともJSONで)をメールで送信します。これが、最初に問題があったことを私が見た方法です。この問題はまだ解決していませんが、それはメールのエンコードなどに関連していると思います。

于 2009-11-25T13:02:49.597 に答える