2013-10-07 2 views
3

JSON을 구문 분석하고 싶지만 값을 얻을 때마다 try-catch 블록에 명령을 넣어야합니다. 다음은 그 예입니다.Try-Catch 블록을 연속적으로 사용하지 않고 JSON을 구문 분석하십시오.

try { 
     this.setID(jsonObject.getLong("id")); 
    } catch (JSONException e) { 
    } 
    try { 
     this.setName(jsonObject.getString("name")); 
    } catch (JSONException e) { 
    } 
//and so on.... 

명령에 예외가 발생하더라도 상관 없습니다. 그래서 모든 try-catch 블록을 삭제하고 명령어를 모두 함께 넣을 수 있는지 궁금합니다.

실제로는 더 많은 자바 문제와 안드로이드 문제 ....

편집뿐만 아니라

그냥 문제가 무엇인지 명확하게. 찾고 있던 태그가 없기 때문에 예외가 발생하면 예외를 처리하는 대신 다음 태그 검사를 계속합니다. 이렇게하려면 위에서 게시 한대로 코드를 작성해야하므로 try-catch 블록이 연속적으로 작성됩니다. 나는 더 빠른 (그리고 더 우아한) 해결책을 찾고 있었다.

+0

Gson은 Java 객체를 JSON 표현으로 변환하는 데 사용할 수있는 Java 라이브러리입니다. JSON 문자열을 동등한 Java로 변환하는데도 사용할 수 있습니다. 참조 : http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html – jittakal

+0

좋은 코드는 try-catch 블록을 피하는 것이 적절하게 처리되어야합니다. – Piyush

답변

9

get 메서드 대신 opt 메서드를 사용할 수 있습니다. 키가 존재하지 않는 것이 좋다고 가정합니다. 키가 선택 사항이 아니며 앱이 기존 필드가 아닌 필드에서 복구 할 수없는 경우 get 메소드를 사용해야하며 오류가 발생하면 빠르게 실패해야합니다.당신이 사용할 수있는

또 다른 유용한 방법은 has() 방법이다. 지정된 키에 대한 매핑이 있는지 여부를 확인합니다. (예 : if (json.has("id") id = json.optString("id"))). 당신이 청소기 구문을 원하는 경우

+0

정확히 내가 무엇을 찾고 있었는지. 감사 –

8

어쩌면 내가 묻는 것을 이해하지 못했지만 jsonObject에 대한 모든 전화를 동일한 try-catch 블록에 넣는 것이 어떻습니까?

try { 
    this.setID(jsonObject.getLong("id")); 
    this.setName(jsonObject.getString("name")); 
} catch (JSONException e) { 
} 

당신은 단지 예외를 삼키는하지한다. 적어도 오류를 기록하십시오.

+2

'get' 메소드 대신'opt' 메소드를 사용할 수도 있습니다. 값을 검색 할 수없는 경우 기본값을 반환하고 예외를 throw하지 않습니다. 그러나 값이 존재하지 않는 것이 허용되는 경우에만 사용해야하며 그렇지 않으면 예외적 인 경우를 분명히 처리해야합니다. – kcoppock

+0

@Sotirios 예.하지만 첫 번째 예외에서 json의 구문 분석이 중지됩니다. –

+0

@kcoppock ok 고마워! 나는 그 기능에 대해 몰랐다. 당신이 대답으로 그것을 넣으면 나는 그것을 받아 들일 수 있습니다 :) –

1

@Sotirios는 json 예외를 무시할 수 없다고 말했습니다.

당신은 방법에 모든 JSON 독서를 넣고 그 방법이처럼 JSONException을 던질 수 :

public void readJson(String json) throws JSONException{ 
    this.setID(jsonObject.getLong("id")); 
    this.setName(jsonObject.getString("name")); 
    } 

하지만 강은 당신이 메서드를 호출 할 때 시도 캐치 할 필요가 :

try { 
      readJson(jLine); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
+0

아마도 나는 명확하지 않았습니다. 나는 내가 찾고있는 태그가 없기 때문에 예외가 발생했을 때, 예외를 처리하는 대신 다음 태그 검사를 계속할 것임을 의미했다. 이렇게하려면 위에 게시 할 때 코드를 작성해야하지만 try-catch 블록의 연속이됩니다. @ kcoppock의 해결책처럼 더 빠르고 (더 우아한) 해결책을 찾고있었습니다. 희망은 지금 더 낫다 :) –

0

나는 그것이 다른 무엇보다도 도서관 문제라고 생각합니다. 자바의 JSON 라이브러리 몇 개는 디자이너가 침입 형 C와 유사한 오류 상태 코드를 사용하려고하지만 Java 예외 구문이 추가 된 것처럼 라이브러리 호출에 예외를 추가하는 경향이 있습니다. 그러한 인터페이스에 대한 동기를 부분적으로 이해할 수 있지만 실제로는 우아하지 않습니다.

나는 가끔은 간단하지만 일을 끝내고 방해가되지 않는 json-simple을 사용하는 것이 좋습니다. 키가 발견되지 않는 경우

+0

나는 당신의 생각에 동의한다. 그러나 opt 메서드를 사용하면 좋은 (그리고 우아한) 대체 :) :) –

0

jsonObject.optFoo("key") 

jsonObject.getFoo("key") 

를 교체하는 null 또는 유사한 디폴트 값은 예외가 발생되는 대신 반환됩니다.

0

, 당신은 gson에 보일 것입니다. json이 어떻게 보이는지 알면 아무것도 없다.

당신의 JSON은 다음과 같습니다 경우

{ 
    "id": 432942039, 
    "name": "My name", 
    "values": [0, 1, 2, 3] 
} 

당신이처럼 보이는 POJO 클래스를 만들 것입니다 :

public class MyClass { 
    public MyClass() {} 
    private long id; 
    private String name; 
    private int[] values; 
} 

과 같은 구문 분석 :

private parse(String jsonString) { 
    Gson gson = new Gson(); 
    MyClass myObject = gson.fromJson(jsonString, MyClass.class); 
} 

그리고 그게 다야. 세터가 필요하지 않습니다. 필드를 맞추기 위해 리플렉션을 사용합니다. 주석이 없습니다. JSON 문자열에 POJO와 일치하지 않는 필드가 있거나 그 반대의 경우에도 오류는 발생하지 않습니다.

관련 문제