3

サーバーから取得した JSON があります。

 "[{\"id\":\"1\",\"name\":\"Milos\",\"city\":\"Smederevo\",\"email\":\"milos\",\"password\":\"\"},
 {\"id\":\"3\",\"name\":\"Boban\",\"city\":\"Beograd\",\"email\":\"bole\",\"password\":\"\"},
 {\"id\":\"4\",\"name\":\"Pele\",\"city\":\"Brazil\",\"email\":\"pele@pele.com\",\"password\":\"\"},
 {\"id\":\"5\",\"name\":\"admin\",\"city\":\"Smederevo\",\"email\":\"admin\",\"password\":\"\"}]"

私はそのjsonを使用して、自分のスレッド(Androidスレッド)に送信しています:

  try {
            // Method from which I am getting Json described above
            String s = dm.getAllUsers();

            /*JSONParser jp = new JSONParser();             
            JsonElement jelement = new JsonParser().parse(s);   
                JsonArray array1 = jelement.getAsJsonArray();*/

            JSONArray array = new JSONArray(s);
            for (int i = 0; i < array.length(); i++) {

                 JSONObject menuObject = array.getJSONObject(i);

                 // doing something with the object
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

そのJsonをまったく処理できません。「java.lang.String を JSONArray に変換できません」というエラーが表示されます。問題の原因が「\」であることはわかっていますが、「\」を取り除く方法がわかりません。

私は試した:

1) s.replace("\\", "");
2) s.replace("\"", "'");
3) s.replaceAll("\\", "");
4) s.replaceAll("\"", "'");

「\」を消去するのに置換しても全く反応しません。また、「google-gson-2.2.2」ライブラリ(上記のコメントの下のコード、メソッドの下のコード)の問題を解決しようとしました。

何かアドバイスをお願いします。

4

7 に答える 7

5

この解決策を試してください。

s.replaceAll("\\\\", "");

これは間違いなく機能します。

于 2013-03-18T10:26:37.330 に答える
4

問題は次のように解決されました:

 1) s = s.trim();
 2) s = s.substring(1, s.length()-1);
 3) s = s.replace("\\", "");

私のjsonは、最初と最後に「二重引用符」を付けて取得されました。文字列変数が、「二重引用符」が文字列の「開始」と「終了」を表すことをどのように理解できないのかわかりません。

皆さん、助けてくれてありがとう。

于 2013-03-18T12:17:23.917 に答える
4

それは私のために働いています...

あなたのjsonでは、「あなたのJson」の値は「」内に含まれているため、配列ではなく文字列と見なされます..

したがって、解決策は次の 2 つのいずれかです。

サーバーの応答を変更できる場合は、json 配列の周囲から "" を削除します。または、最初に文字列として解析してから、その文字列から json 配列を作成します..

String notes = jobj.getString("GetNotesResult");
jarray = new JSONArray(notes);
于 2014-05-15T12:19:48.630 に答える
2

なぜそれがあなたのために機能しないのか私にはわかりません。ドットネットWebサービスは応答します\が、Javaはそれを解析できます。私は以下のようにしました、そしてそれは働きました。

私はこのようにコーディングしました。

JSONArray users = null;
String jsStr =  "[{\"id\":\"1\",\"name\":\"Milos\",\"city\":\"Smederevo\",\"email\":\"milos\",\"password\":\"\"},{\"id\":\"3\",\"name\":\"Boban\",\"city\":\"Beograd\",\"email\":\"bole\",\"password\":\"\"},{\"id\":\"4\",\"name\":\"Pele\",\"city\":\"Brazil\",\"email\":\"pele@pele.com\",\"password\":\"\"}, {\"id\":\"5\",\"name\":\"admin\",\"city\":\"Smederevo\",\"email\":\"admin\",\"password\":\"\"}]";
try {
    users = new JSONArray(jsStr);
} catch (JSONException e) {
    e.printStackTrace();
}

Log.v("JSONStr", String.valueOf(users.length()));
for(int i = 0; i<users.length(); i++){
    try {
        Log.v("Name", users.getJSONObject(i).getString("name"));
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

を参照してくださいLogCat

03-18 16:34:46.459: V/JSONStr(307): 4
03-18 16:34:46.479: V/Name(307): Milos
03-18 16:34:46.479: V/Name(307): Boban
03-18 16:34:46.479: V/Name(307): Pele
03-18 16:34:46.479: V/Name(307): admin
于 2013-03-18T11:07:17.120 に答える
2

間のバックスラッシュ () を削除した場合にのみ、json が有効になります。次のようなものを使用できます: strJson = strJson.replaceAll("\\\\", "");またはstrJson = strJson.replace("\\", "");、json 文字列の間のスラッシュ () を削除します。replaceAll() メソッドは最初の引数を正規表現として扱うため、バックスラッシュを二重にエスケープする必要がありますが、replace() メソッドはそれをリテラル文字列として扱うため、一度だけエスケープする必要があることに注意してください。理解を深めるために、以下の例をご覧ください。デモンストレーション用に、ハード ドライブの json.txt という名前のファイルに json テキストを保存しました。ファイルの内容は次のようになります。

[{\"id\":\"1\",\"name\":\"Milos\",\"city\":\"Smederevo\",\"email\":\"milos\",\"password\":\"\"},
 {\"id\":\"3\",\"name\":\"Boban\",\"city\":\"Beograd\",\"email\":\"bole\",\"password\":\"\"},
 {\"id\":\"4\",\"name\":\"Pele\",\"city\":\"Brazil\",\"email\":\"pele@pele.com\",\"password\":\"\"},
 {\"id\":\"5\",\"name\":\"admin\",\"city\":\"Smederevo\",\"email\":\"admin\",\"password\":\"\"}]

json 配列を取得するコードは次のとおりです。

package com.stackoverflow.com;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


public class JsonTest {

    public static void main(String[] args) {    

        try {
            FileReader fileReader = new FileReader("C:/Users/sarath_sivan/Desktop/json.txt");
            BufferedReader br = new BufferedReader(fileReader); 
            StringBuilder strJsonBuilder = new StringBuilder();
            String strLine; 

            while((strLine = br.readLine()) != null) { 
                strJsonBuilder.append(strLine);
            }

            String strJson = strJsonBuilder.toString();
            strJson = strJson.replaceAll("\\\\", ""); /*OR you can use strJson = strJson.replace("\\", "");*/
            JSONArray jsonArray = new JSONArray(strJson);

            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject menuObject = jsonArray.getJSONObject(i);
                System.out.println("id: " + menuObject.getInt("id"));
                System.out.println("name: " + menuObject.getString("name"));
                System.out.println("city: " + menuObject.getString("city"));
                System.out.println("email: " + menuObject.getString("email"));
                System.out.println("password: " + menuObject.getString("password"));
                System.out.println();
                // do something with your JSON
            }

            fileReader.close();

        } catch (JSONException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
于 2013-03-18T11:44:27.087 に答える
1
s = s.replace("\\", "");
System.out.println(s);

String変更したものをに割り当てる必要がありますs。これにより、適切な解析可能なJSONが得られます。

于 2013-03-18T10:27:41.633 に答える
0

さまざまなString.replaceAll(rexex、 "")ソリューションはあまり好きではありません。JSONの一部の文字列に、フォーマットではなく情報の一部として\が含まれている場合はどうなりますか?JSONに「パスワード」フィールドが表示されます。これがクリアテキストになるのかハッシュになるのかはわかりませんが、前者の場合、ユーザーがパスワードに円記号を使用すると、プログラムが機能しなくなる可能性があります。

ここで実行したいのは、文字列をエスケープ解除することです。これは、私が知る限り、単純な正規表現では解決できない問題ですが、これまで何千回も解決されてきた問題です。車輪の再発明をする必要はありません。

Javaで文字列リテラルをエスケープ解除する方法

于 2013-03-18T10:41:28.997 に答える