2011-11-04 3 views
4

JSON에서 인터넷 기반 CMS와 통신하는 앱을 작성 중입니다. 불행하게도, 몇몇 유형의 네트워크 접속. 공공 Wifi를 통해 그들이 정상적으로 그물을 사용할 수 있기 전에 통과 해야하는 웹 게이트웨이가 있습니다. 즉, JSON에서 HTML 웹 페이지를 구문 분석하려고합니다. 나는 HTML이 잘 구성된 JSON이 아니라는 것을 나타내는 예외를 던지기를 기대하지만 대신 구문 분석을 시도하고 메모리가 부족 해지고 접 힙니다.안드로이드에서 임의의 문자열이 올바른 형식의 JSON인지 간단하게 알 수 있습니까?

Android JSON 함수를 살펴본 결과 문자열이 JSON인지 여부 만 알려주는 함수를 찾을 수 없습니다. 그런 기능이 있습니까? 그렇지 않다면 분명히 비 JSON 문자열을 잡아 내기 위해 경험적으로 작성해야할까요?

답변

1

다음과 같음 :

Header contentType = httpResponse.getFirstHeader("Content-Type"); 
if (contentType.getValue().compareToIgnoreCase("application/json") != 0) { 
    // response is not JSON 
    response = null; 
} 
3

올바른 형식의 JSON을 확인하는 정확한 방법은 HTTP 응답에서 반환 된 문자열을 기반으로 JSONObject를 만드는 것입니다. 결과 문자열이 올바른 형식의 JSON이 아닌 경우 JSONException이 발생합니다.

메모리가 너무 빨리 부족한 이유를 모르겠습니다. 반환 된 문자열이 매우 크기 때문입니까? 그렇다면 JSON 형식의 이점을 누릴 수 있습니다. 문자열의 첫 번째 문자를 확인하십시오. { 인 경우 일 가능성이 높으며 JSON입니다. 그렇지 않으면 JSON이 아닙니다.

"아마도"이라는 단어에 유의하십시오. 서버가 가끔 {을 첫 번째 문자로 사용하여 다른 응답을 제공하는지 여부를 알 수 없으며 JSON이 아니기 때문입니다. 당신이 결정합니다.

here 형식의 JSON 문자열을 읽어야합니다.

+0

대개 큰 웹 페이지입니다. OOM을 발생시키기에 그 자체로는 충분하지 않지만, 파서가 압박감에 빠져 나가고 있다고 생각합니다. 초기 중괄호의 온전한 체크 아이디어는 마음에 들지만, HTML, JSON, 바이너리를 제외하고는 아무 것도 얻을 수 없을 것입니다. 그건 그렇고, 우리는 이미 이런 종류의 문제를 예상하여 JSONException을 트래핑하고 있습니다. 아마도 JSON이 아닌 짧은 문자열로 인해 문제가 발생할 수 있습니다. –

+0

링크도 환상적입니다. 감사합니다! –

2

응답의 HTTP 헤더 인 Content-Type을 확인해야합니다. HTML을 반환하는 경우 text/html이됩니다. JSON이 반환되면 application/json이됩니다.

+0

아, 고마워. 네, 그게 가장 좋은 해결책 같아요 :) –

2

유효한 JSON인지 아닌지 알려면 구문 분석이 필요합니다. 안드로이드는 XML의 DOM 파서 같은 작업 바닐라 JSON 구문 분석을 번들 - 그 파서 메모리에 전체 구문 트리를 구성하려고 - 따라서 그들은

  • 성능이 낮은 경향이있다
  • 무거운 메모리 사용량

나는 것 GSON과 같은 pull 파서를 사용할 것을 제안합니다. JSON에서 객체가 필요하거나 구문 분석을 위해 바이너리 (16KB)를 사용하면 데이터 바인딩이 편리합니다 (https://github.com/ko5tik/jsonserializer)

+0

이것은 조사할만한 가치가있어 보입니다. 감사합니다! –

+1

필자는이 게임을 사용하여 내 게임에서 최고 기록 인 2000 개의 JSON 항목을 가져 와서 구문 분석합니다. 시작시 구문 분석에 약 1 초 걸린다 –

+0

Sweeeeeeeeet :) –

관련 문제