chuyển đổi từ chuỗi thành đối tượng json android


107

Tôi đang làm việc trên một ứng dụng Android. Trong ứng dụng của tôi, tôi phải chuyển đổi một chuỗi thành Đối tượng Json, sau đó phân tích cú pháp các giá trị. Tôi đã kiểm tra một giải pháp trong stackoverflow và tìm thấy sự cố tương tự ở đây liên kết

Giải pháp là như thế này

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

Tôi sử dụng cùng một cách trong mã của mình. Chuỗi của tôi là

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

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

Và sau khi thay thế tôi nhận được kết quả như thế này

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

khi tôi thực hiện JSONObject jsonObj = new JSONObject(mybizData);

Tôi nhận được ngoại lệ json dưới đây

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

Xin hãy giúp tôi giải quyết vấn đề của tôi.


Tôi đoán ký tự vi phạm là một dấu gạch chéo ngược vì sự thay thế của bạn. Chính xác thì tại sao bạn lại làm vậy? Chuỗi JSON đến từ đâu?
tiguchi

Tôi đang nhận chuỗi từ html..không phải là json
sarath

1
Chỉ cần loại bỏ mystring = mystring.replace ("\" "," \\\ ""); và xem liệu nó có phù hợp với bạn không.
tiguchi

Câu trả lời:


227

Xóa các dấu gạch chéo:

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
điều gì sẽ xảy ra nếu chuỗi là một mảng các đối tượng JSON? Giống như "[{}, {}, {}]"
Francisco Corrales Morales

3
@FranciscoCorralesMorales bạn có thể sử dụng JSONArray obj = new JSONArray(json);. Sau đó, bạn có thể sử dụng vòng lặp for để lặp qua mảng.
Phil

2
@FranciscoCorralesMorales chỉ sử dụng một khối try-catch . Nếu một cái không thành công, hãy giả sử cái kia.
Phil

1
@ ripDaddy69 Có vẻ như đó là JSON không hợp lệ. Nó mong đợi các cặp khóa-giá trị được bao quanh bởi dấu ngoặc nhọn. Hãy thử một cái gì đó như {"Fat cat":"meow"}.
Phil

2
@Phil Đó dường như không phải là một phép gán Chuỗi java hợp lệ. Tôi không hiểu mình đang làm gì khác mặc dù JSONObject obj = new JSONObject ("Fat cat": "meo"); Tôi đã tìm ra, tôi cần sử dụng \ trước các dấu ngoặc kép, và sau đó là các câu trích dẫn thực tế xung quanh toàn bộ vấn đề. Cảm ơn.

31

đó là công việc

    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
Mặc dù điều này trả lời cho câu hỏi, nhưng nó không giải thích tại sao hoặc cách nó hoạt động. Hãy thêm một lời giải thích như vậy.
CerebralFart

Có vẻ như một giải pháp mã đơn giản, yêu cầu tạo một đối tượng khác xử lý trình tự thoát.
kelalaka

7

thử cái này:

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

2
điều gì sẽ xảy ra nếu chuỗi là một mảng các đối tượng JSON? Như "[{}, {}, {}]"
Francisco Corrales Morales

Đây là một ý tưởng tốt. Một trích dẫn duy nhất hoạt động và nó loại bỏ sự cần thiết của các ký tự thoát.
david m lee

1
Apostrophe có thể hoạt động trong JAVA, nhưng nó không phải là JSON hợp pháp nghiêm ngặt . Vì vậy, bạn có thể cần phải làm những điều khác nhau trong các ngôn ngữ hoặc tình huống khác.
Jesse Chisholm

4

Để lấy JSONObject hoặc JSONArray từ một Chuỗi, tôi đã tạo lớp này:

public static class JSON {

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

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

Tại đây để tải 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);
}

Thí dụ:

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;
    }
}

Bạn chỉ có thể kiểm tra ký tự đầu tiên của chuỗi JSON để xem nó có phải là [hay không hoặc {để biết nó là một mảng hay một đối tượng. Sau đó, bạn sẽ không mạo hiểm cả hai trường hợp ngoại lệ, chỉ một trường hợp thích hợp.
Jesse Chisholm

3

chỉ cần thử cái này, cuối cùng cái này cũng phù hợp với tôi:

//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

Bạn chỉ cần các dòng mã như sau:

 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

Đây là mã và bạn có thể quyết định
sử dụng StringBuffer (được đồng bộ hóa) hoặc StringBuilder nhanh hơn.

Điểm chuẩn cho thấy StringBuilder nhanh hơn.

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

Có thể ở dưới là tốt hơn.

JSONObject jsonObject=null;
    try {
        jsonObject=new JSONObject();
        jsonObject.put("phonetype","N95");
        jsonObject.put("cat","wp");
        String jsonStr=jsonObject.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.