文字列からjsonオブジェクトandroidへの変換


107

私はAndroidアプリケーションに取り組んでいます。私のアプリでは、文字列をJsonオブジェクトに変換してから、値を解析する必要があります。私はstackoverflowで解決策をチェックし、同様の問題がここにあるリンクを見つけました

解決策はこのようなものです

       `{"phonetype":"N95","cat":"WP"}`
        JSONObject jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");

私のコードでも同じように使用しています。私のひもは

{"ApiInfo":{"description":"userDetails","status":"success"},"userDetails":{"Name":"somename","userName":"value"},"pendingPushDetails":[]}

string mystring= mystring.replace("\"", "\\\"");

そして交換後、私はこのように結果を得ました

{\"ApiInfo\":{\"description\":\"userDetails\",\"status\":\"success\"},\"userDetails\":{\"Name\":\"Sarath Babu\",\"userName\":\"sarath.babu.sarath babu\",\"Token\":\"ZIhvXsZlKCNL6Xj9OPIOOz3FlGta9g\",\"userId\":\"118\"},\"pendingPushDetails\":[]}

私が実行するとき JSONObject jsonObj = new JSONObject(mybizData);

以下のjson例外が発生しています

org.json.JSONException: Expected literal value at character 1 of

私の問題を解決するのを手伝ってください。


あなたの置換のため、問題の文字はバックスラッシュだと思います。なぜ正確にそれをしているのですか?JSON文字列はどこから来たのですか?
tiguchi 2013

私はhtmlから文字列を取得しています。jsonとしてではなく
サラト2013

1
mystring = mystring.replace( "\" "、" \\\ "");を削除するだけです。そしてそれがあなたのために働くかどうか見てください。
tiguchi 2013

回答:


227

スラッシュを削除します。

String json = {"phonetype":"N95","cat":"WP"};

try {

    JSONObject obj = new JSONObject(json);

    Log.d("My App", obj.toString());

} catch (Throwable t) {
    Log.e("My App", "Could not parse malformed JSON: \"" + json + "\"");
}

4
文字列がJSONオブジェクトの配列である場合はどうなりますか?以下のような"[{}、{}、{}]"
サンフランシスココラレスモラレス

3
@FranciscoCorralesMoralesを使用できますJSONArray obj = new JSONArray(json);。次に、forループを使用して配列を反復処理できます。
Phil

2
@FranciscoCorralesMoralesは、try-catchブロックを使用するだけです。一方が失敗した場合は、もう一方を想定します。
Phil

1
@ ripDaddy69それは無効なJSONのようです。中括弧で囲まれたキーと値のペアを想定しています。のようなものを試してください{"Fat cat":"meow"}
Phil

2
@Philそれは有効なjava String割り当てではないようです。JSONObject obj = new JSONObject( "Fat cat": "meow");とはいえ、自分が何をしているのか理解できません。私はそれを理解しました、私は引用符の前に\を使用する必要があり、それから全体を実際の引用符で囲みました。ありがとう。

31

その仕事

    String json = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";

    try {

        JSONObject obj = new JSONObject(json);

        Log.d("My App", obj.toString());
        Log.d("phonetype value ", obj.getString("phonetype"));

    } catch (Throwable tx) {
        Log.e("My App", "Could not parse malformed JSON: \"" + json + "\"");
    }

1
これは質問への回答ですが、その理由や動作方法については説明していません。そのような説明を加えてください。
CerebralFart 2016年

エスケープシーケンスを処理する別のオブジェクトを作成する必要がある単純なコードソリューションのようです。
ケララカ

7

これを試して:

String json = "{'phonetype':'N95','cat':'WP'}";

2
文字列がJSONオブジェクトの配列である場合はどうなりますか?「[{}、{}、{}]」のように
サンフランシスココラレスモラレス2014年

これは良い考えです。一重引用符は機能し、エスケープ文字の必要がなくなります。
david m lee

1
JAVAではアポストロフィが機能する可能性がありますが、厳密に正当なJSON ではありません。そのため、他の言語や状況では異なる方法で物事を行う必要があるかもしれません。
ジェシーチザム2018

4

文字列からJSONObjectまたはJSONArrayを取得するには、このクラスを作成しました。

public static class JSON {

     public Object obj = null;
     public boolean isJsonArray = false;

     JSON(Object obj, boolean isJsonArray){
         this.obj = obj;
         this.isJsonArray = isJsonArray;
     }
}

JSONを取得するには:

public static JSON fromStringToJSON(String jsonString){

    boolean isJsonArray = false;
    Object obj = null;

    try {
        JSONArray jsonArray = new JSONArray(jsonString);
        Log.d("JSON", jsonArray.toString());
        obj = jsonArray;
        isJsonArray = true;
    }
    catch (Throwable t) {
        Log.e("JSON", "Malformed JSON: \"" + jsonString + "\"");
    }

    if (object == null) {
        try {
            JSONObject jsonObject = new JSONObject(jsonString);
            Log.d("JSON", jsonObject.toString());
            obj = jsonObject;
            isJsonArray = false;
        } catch (Throwable t) {
            Log.e("JSON", "Malformed JSON: \"" + jsonString + "\"");
        }
    }

    return new JSON(obj, isJsonArray);
}

例:

JSON json = fromStringToJSON("{\"message\":\"ciao\"}");
if (json.obj != null) {

    // If the String is a JSON array
    if (json.isJsonArray) {
        JSONArray jsonArray = (JSONArray) json.obj;
    }
    // If it's a JSON object
    else {
        JSONObject jsonObject = (JSONObject) json.obj;
    }
}

あなたはちょうどそれがあるかどうかを確認するためにJSON文字列の最初の文字をテストすることができ[たり{、それが配列またはオブジェクトであるかどうかを知るために。そうすれば、両方の例外を危険にさらすことはなく、適切なものだけを危険にさらすことになります。
ジェシーチザム2018

3

これを試してみてください、最後にこれは私にとってはうまくいきます:

//delete backslashes ( \ ) :
            data = data.replaceAll("[\\\\]{1}[\"]{1}","\"");
//delete first and last double quotation ( " ) :
            data = data.substring(data.indexOf("{"),data.lastIndexOf("}")+1);
            JSONObject json = new JSONObject(data);

3

次のようなコード行が必要です。

 try {
        String myjsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
        JSONObject jsonObject = new JSONObject(myjsonString );
        //getting specific key values
        Log.d("phonetype = ", jsonObject.getString("phonetype"));
        Log.d("cat = ", jsonObject.getString("cat");
    }catch (Exception ex) {
         StringWriter stringWriter = new StringWriter();
         ex.printStackTrace(new PrintWriter(stringWriter));
         Log.e("exception ::: ", stringwriter.toString());
    }

0

これがコードです。どの
(同期)StringBufferまたはより高速なStringBuilderを使用するかを決定できます。

ベンチマークは、StringBuilderの方が高速であることを示しています。

public class Main {
            int times = 777;
            long t;

            {
                StringBuffer sb = new StringBuffer();
                t = System.currentTimeMillis();
                for (int i = times; i --> 0 ;) {
                    sb.append("");
                    getJSONFromStringBuffer(String stringJSON);
                }
                System.out.println(System.currentTimeMillis() - t);
            }

            {
                StringBuilder sb = new StringBuilder();
                t = System.currentTimeMillis();
                for (int i = times; i --> 0 ;) {
                     getJSONFromStringBUilder(String stringJSON);
                    sb.append("");
                }
                System.out.println(System.currentTimeMillis() - t);
            }
            private String getJSONFromStringBUilder(String stringJSONArray) throws JSONException {
                return new StringBuffer(
                       new JSONArray(stringJSONArray).getJSONObject(0).getString("phonetype"))
                           .append(" ")
                           .append(
                       new JSONArray(employeeID).getJSONObject(0).getString("cat"))
                      .toString();
            }
            private String getJSONFromStringBuffer(String stringJSONArray) throws JSONException {
                return new StringBuffer(
                       new JSONArray(stringJSONArray).getJSONObject(0).getString("phonetype"))
                           .append(" ")
                           .append(
                       new JSONArray(employeeID).getJSONObject(0).getString("cat"))
                      .toString();
            }
        }

0

以下の方が良いかもしれません。

JSONObject jsonObject=null;
    try {
        jsonObject=new JSONObject();
        jsonObject.put("phonetype","N95");
        jsonObject.put("cat","wp");
        String jsonStr=jsonObject.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.