문자열에서 json 객체 android로 변환


107

Android 애플리케이션에서 작업 중입니다. 내 앱에서 문자열을 Json Object로 변환 한 다음 값을 구문 분석해야합니다. I에 유래에서 해결책을 확인하고 여기에 유사한 문제를 발견 링크를

해결책은 다음과 같습니다.

       `{"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-08-12

내가 JSON으로 html..not에서 문자열을 얻고있다
sarath

1
mystring = mystring.replace ( "\" ","\\\ ""); 그리고 그것이 당신을 위해 작동하는지 확인하십시오.
tiguchi 2013-08-12

답변:


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 루프 를 사용하여 배열을 반복 할 수 있습니다 .

2
@FranciscoCorralesMorales는 try-catch 블록을 사용합니다 . 하나가 실패하면 다른 하나를 가정하십시오.
Phil

1
@ ripDaddy69 잘못된 JSON 인 것 같습니다. 중괄호로 둘러싸인 키-값 쌍을 예상합니다. 같은 것을 시도하십시오 {"Fat cat":"meow"}.
Phil

2
@Phil 유효한 자바 문자열 할당이 아닌 것 같습니다. 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 객체의 배열이면 어떻게 될까요? 추천 "[{}, {}, {}]"
프란 코랄 사기

이것은 좋은 생각입니다. 작은 따옴표가 작동하며 이스케이프 문자가 필요하지 않습니다.
데이비드 리 해요

1
아포스트로피는 JAVA에서 작동 할 수 있지만 엄격한 법적 JSON 은 아닙니다 . 따라서 다른 언어 나 상황에서 다르게해야 할 수도 있습니다.
Jesse Chisholm은

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 문자열의 첫 번째 문자를 테스트하여 그것이 있는지 확인 [하거나 {그것이 배열인지 객체인지 알 수 있습니다. 그러면 두 가지 예외를 모두 위험에 빠뜨리지 않고 적절한 예외를 감수해야합니다.
Jesse Chisholm은

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.