25

JSON を使用して、サーバーからオブジェクトの配列を取得しようとしています。

サーバーから次の文字列が送信されます。

"[{\"DealComment\":null,\"DealVotes\":[],\"DealId\":1,\"CompanyId\":1,\"StartDate\":\"2012-12-13T00:00:00\",\"EndDate\":\"2012-12-16T00:00:00\",\"CouponCode\":\"Test Coupon 1\",\"Description\":\"Test Deal Description 1\",\"VoteUp\":null,\"VoteDown\":null,\"ViewCount\":null,\"Title\":\"Test Deal 1\"},{\"DealComment\":null,\"DealVotes\":[],\"DealId\":2,\"CompanyId\":1,\"StartDate\":\"2012-12-16T00:00:00\",\"EndDate\":\"2012-12-17T00:00:00\",\"CouponCode\":\"Test Coupon 2\",\"Description\":\"Test Description 2\",\"VoteUp\":null,\"VoteDown\":null,\"ViewCount\":null,\"Title\":\"Test Deal 2\"},{\"DealComment\":null,\"DealVotes\":[],\"DealId\":3,\"CompanyId\":1,\"StartDate\":\"2012-12-14T00:00:00\",\"EndDate\":\"2012-12-15T00:00:00\",\"CouponCode\":\"Test Code 3\",\"Description\":\"Test Description 3\",\"VoteUp\":null,\"VoteDown\":null,\"ViewCount\":null,\"Title\":\"Test Deal 3\"},{\"DealComment\":null,\"DealVotes\":[],\"DealId\":4,\"CompanyId\":1,\"StartDate\":\"2012-12-12T00:00:00\",\"EndDate\":\"2012-12-13T00:00:00\",\"CouponCode\":\"Test Coupon 4\",\"Description\":\"Test Description 4\",\"VoteUp\":null,\"VoteDown\":null,\"ViewCount\":null,\"Title\":\"Test Deal 4\"},{\"DealComment\":null,\"DealVotes\":[],\"DealId\":5,\"CompanyId\":2,\"StartDate\":\"2012-12-12T00:00:00\",\"EndDate\":\"2012-12-14T00:00:00\",\"CouponCode\":\"AwD\",\"Description\":\"Very awesome deal!\",\"VoteUp\":null,\"VoteDown\":null,\"ViewCount\":null,\"Title\":\"Awesome Deal 1\"}]"

ここで、文字列をよく見ると、\"every ではなくan が含まれていることがわかり"ます。現在、文字列を JSONArray にフォーマットできません。\"したがって、出現するすべての を に置き換える必要があります"。これは非常に簡単な作業で、エスケープ シーケンス\ではありませんでした。

次のコードを使用してみました。

String jsonFormattedString = jsonStr.replaceAll("\\", "");

しかし、それは私に次の例外を与えます。

12-19 00:35:59.575: W/System.err(444): java.util.regex.PatternSyntaxException: Syntax error U_REGEX_BAD_ESCAPE_SEQUENCE near index 1:
12-19 00:35:59.575: W/System.err(444): \
12-19 00:35:59.575: W/System.err(444):  ^

私のコード全体、それが役に立つ場合に備えて:

public void getAllDealsFromServerJson()
{

    String apiUrl = "http://passme.azurewebsites.net/api/TestApi/";


    HttpClient client = new DefaultHttpClient();
    HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
    HttpResponse response;
    JSONObject json = new JSONObject();

    try{
        HttpPost httpPost = new HttpPost(apiUrl);
        json.put("requestType", "getalldeals" );

        StringEntity se = new StringEntity( json.toString());  
        se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        httpPost.setEntity(se);
        response = client.execute(httpPost);
        Log.d("Http Response:", response.toString());
        jsonResponse = response.toString();

        BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
        String jsonStr = reader.readLine();
        Log.d("String Response", jsonStr);
        String jsonFormattedString = jsonStr.replaceAll("\\", ""); // gives error
        Log.d("Formatted String", jsonFormattedString);
        //JSONTokener tokener = new JSONTokener(jsonFormattedString);
        /*JSONObject finalResult = new JSONObject(tokener);
        Log.d("JSON Response", "" + finalResult.optString("Title"));*/
        JSONArray resultArray = new JSONArray(jsonFormattedString);
        Log.d("JSON Array Result Length", "" + resultArray.length());
        Log.d("JSON Array Result ", "" + resultArray.getJSONObject(0).optInt("DealId"));

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
4

6 に答える 6

47

これを試して:

String jsonFormattedString = jsonStr.replaceAll("\\\\", "");

バックスラッシュは正規表現のエスケープ文字であるため (replaceAll()パラメータとしてバックスラッシュを受け取ります)、これもエスケープする必要があります。

于 2012-12-18T19:19:02.617 に答える
16

実際の正しい方法は次のとおりです。

String jsonFormattedString = jsonStr.replace("\\\"", "\"");

すべてを何も\"持たないのではなく、のみで置き換えたいと考えています(json文字列のスラッシュがある場合はそれを使い果たしてしまいます)。一般に信じられていることとは反対に、指定された文字列のすべての出現箇所も置き換えられます。のように、正規表現を使用しないため、通常は高速です。"\replace(...)replaceAll(...)

于 2012-12-18T19:33:20.383 に答える
10

使用するだけです:

try {
        jsonFormattedString = new JSONTokener(jsonString).nextValue().toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }

ドキュメントを見る

于 2014-09-25T08:51:09.947 に答える
6

入力文字列が二重に JSON エンコードされているようです。それをデコードしてから、もう一度デコードする必要があります。

Javaでそれを行う方法についての私の最善の推測は次のとおりです。

JSONArray resultArray = new JSONArray(new JSONString(jsonFormattedString));

JSONStringここではそれがタイプであると仮定しています。実際のソリューションは異なる場合があります。

通常の状況では、サービスが JSON をそのまま提供することを期待しています。このサービスは、JSON を含む(JSON 仕様に従ってエンコードされた) 文字列を提供しているようです。

以下の違いです。

String someJSON = "[0, 1, 2]";
String doublyEncodedJSON = "\"[0, 1, 2]\"";

余分な先頭と末尾の引用符に注意してください。後者は JSON の文字列だからです。実際のオブジェクトを取得するには、2 回デコードする必要があります。

于 2012-12-18T19:20:32.887 に答える
4

あなたはただ使うことができます:

str.replace("\\","");

replaceは文字列をパラメータとして受け取り、replaceAllはRegExを使用します。これも次のように機能する可能性があります。

str.replaceAll("\\\\", "");
于 2012-12-18T19:32:51.013 に答える