การแปลงจากสตริงเป็นวัตถุ json android


107

ฉันกำลังทำงานกับแอปพลิเคชัน Android ในแอพของฉันฉันต้องแปลงสตริงเป็น Json Object จากนั้นแยกวิเคราะห์ค่า ฉันตรวจสอบวิธีแก้ปัญหาใน 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

ฉันได้รับสตริงจาก html .. ไม่ใช่ json
sarath

1
เพียงลบ mystring = mystring.replace ("\" "," \\\ ""); และดูว่ามันเหมาะกับคุณไหม
tiguchi

คำตอบ:


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 เช่น "[{}, {}, {}]"
Francisco Corrales Morales

3
@FranciscoCorralesMorales JSONArray obj = new JSONArray(json);คุณสามารถใช้ จากนั้นคุณสามารถใช้for-loopเพื่อวนซ้ำผ่านอาร์เรย์
ฟิลิป

2
@FranciscoCorralesMorales ใช้บล็อกลองจับ หากล้มเหลวให้ถือว่าอีกฝ่ายหนึ่ง
ฟิล

1
@ ripDaddy69 ดูเหมือนว่าจะเป็น JSON ที่ไม่ถูกต้อง คาดว่าจะมีการจับคู่คีย์ - ค่าที่ล้อมรอบด้วยวงเล็บปีกกา {"Fat cat":"meow"}ลองสิ่งที่ต้องการ
ฟิล

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

ดูเหมือนว่าจะเป็นวิธีแก้รหัสง่ายๆที่ต้องสร้างวัตถุอื่นที่จัดการลำดับการหลีกเลี่ยง
kelalaka

7

ลองสิ่งนี้:

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

2
จะเกิดอะไรขึ้นถ้าสตริงเป็นอาร์เรย์ของออบเจ็กต์ JSON เช่น "[{}, {}, {}]"
Francisco Corrales Morales

นี่เป็นความคิดที่ดี ใบเสนอราคาเดียวใช้งานได้และไม่จำเป็นต้องใช้อักขระ Escape
david m lee

1
Apostrophe อาจใช้ได้ใน JAVA แต่ไม่ใช่JSON ทางกฎหมายที่เข้มงวด ดังนั้นคุณอาจต้องทำสิ่งต่างๆให้แตกต่างออกไปในภาษาหรือสถานการณ์อื่น ๆ
Jesse Chisholm

4

ในการรับ JSONObject หรือ JSONArray จาก String ฉันได้สร้างคลาสนี้:

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 เพื่อดูว่าเป็น[หรือ{เพื่อให้ทราบว่าเป็นอาร์เรย์หรือวัตถุ จากนั้นคุณจะไม่เสี่ยงกับข้อยกเว้นทั้งสองเพียงข้อเดียวที่เกี่ยวข้อง
Jesse Chisholm

4

คุณต้องมีบรรทัดของโค้ดดังนี้:

   try {
        String myjsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
        JSONObject jsonObject = new JSONObject(myjsonString );
        //displaying the JSONObject as a String
        Log.d("JSONObject = ", jsonObject.toString());
        //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());
    }

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

0

นี่คือรหัสและคุณสามารถตัดสินใจได้ว่า
จะใช้ StringBuffer (ซิงโครไนซ์) หรือเร็วกว่า StringBuilder

Benchmark แสดงให้เห็นว่า 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.