0

次の JSON をサーバーにアップロードしようとしました。

{
    "sign": "cancer",
    "date": 30,
    "month": 10,
    "year": 2013,
    "reading": "vQdKU0SufpGmvkkyfvkdUr&yg/ rodatmifvkyfav ay:avjzpfrnf/ olwpfyg; rodapvkdaom udpörsm;udk rvkyfavaumif;avjzpfrnf/ vltrsm; olwpfyg;\ pdwf0ifpm;p&m jzpfaewufonf/ aiGaMu;udpö owdxm;NyD; udkifwG,fyg/ vuf0,faiGaysufaomaMumifh Mum;pdkufavsmf&udef; MuHKrnf/"
}

サーバーは HTTP 400 を返します。

JSON をサーバーで受け入れられるようにするために必要な変更はありますか?

アップロードを実行するコードは次のとおりです。

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setRequestProperty("Accept", "application/json");

        String input = "{\"sign\": \"" + reading.getSign() + "\"" + ", \"date\": " 
                + reading.getDate() + ", \"month\": " + reading.getMonth() 
                + ", \"year\": " + reading.getYear()
                + ", \"reading\": \"" + reading.getReading() + "\"}";

        OutputStream os = conn.getOutputStream();
        os.write(input.getBytes());
        os.flush();                        

        if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + conn.getResponseCode());
        }
4

2 に答える 2

1

あなたの問題は、特殊文字をエスケープしていないことです。そのような json/sql/html/etc 文字列を生成することは問題があり、避けるべきです。

json ライブラリの使用を検討する必要があります。WCF ライブラリに組み込まれているものがあります。または、Json.NET http://james.newtonking.com/jsonなどのより軽量なものを使用してこれを実現できます。

Json.NET でこれを行うにはいくつかの方法がありますが、これが最も簡単です。

var temp = new { 
    sign    = reading.getSign(),
    date    = reading.getDate(),
    month   = reading.getMonth(),
    year    = reading.getYear(),
    reading = reading.getReading()
};
string jsonString = JObject.FromObject(temp).ToString();
于 2013-10-31T05:33:39.233 に答える
1

文字列を JSON 文字列としてエンコードすることで問題を解決しました。これを行う簡単な方法の 1 つは、json-simple API から JSONObject を使用することです。

JSONObject inputJson = new JSONObject();
        inputJson.put("sign", reading.getSign());
        inputJson.put("date", reading.getDate());
        inputJson.put("month", reading.getMonth());
        inputJson.put("year", reading.getYear());
        inputJson.put("reading", reading.getReading());
于 2013-10-31T05:24:10.323 に答える