2010-08-16 2 views
9

JSON 문자열을받는 GWT 응용 프로그램에서 작업 중이며 각 개체의 값을 가져 오는 데 어려움을 겪고 있습니다. 들어오는 JSON 문자열을 객체 배열로 전송하려고합니다.GWT : 들어오는 JSON 문자열 처리

여기 (방화범 응답 탭)을 JSON되면, "d는"(웹 서비스가 소비되는 C 번호 닷넷 것입니다.

{ 
    "d": [ 
     { 
      "__type": "Event", 
      "ID": 30, 
      "Bin": 1, 
      "Date": "\/Date(1281544749000)\/", 
      "Desc": "Blue with white stripes.", 
      "Category": "1" 
     }, 
     { 
      "__type": "Event", 
      "ID": 16, 
      "Bin": 3, 
      "Date": "\/Date(1281636239000)\/", 
      "Desc": "Yellow with pink stripes", 
      "Category": "1" 
     } 

    ] 
} 

내가 개체로 JSON을 구문 분석하기 위해 노력하고있어, 다음 배열에 삽입. 내가 반향 전체 "D"개체를 Window.alert를 사용하여 얻을 수 있어요. 그러나, 나는 배열의 요소에 액세스하려고 할 때, GWT 디버거 그냥 충돌합니다.

//My GWT array to receive JSON Array 
ArrayList<Item> itemInfo = new ArrayList<Item>(); 

//Getting response JSON into something I can work with.(THIS FAILS) 
JSONArray jsonValue = JSONParser.parse(incomingJsonRespone); 

//Just trying to verify I'm getting values 
for (int i=0; i<jsonValue.size(); i++) { 
    JSONValue jsonItem = = JsonValue.get(i).getString(); 
    Window.alert(jsonItem); 
    itemInfo.add(jsonItem); 

}

나는 JSONArray 인스턴스가 생성되는 곳으로 문제를 좁혔다 고 생각합니다. 오류 메시지의 방법으로 많은 도움을 얻지 못하기 때문에 내가 어떻게 이런 일을하려고하는지에 뻔뻔스럽게 잘못된 점이 있습니까?

+1

이 질문은 http://stackoverflow.com/questions/3449099/parse-json-with-gwt-2-0/에서 확인하실 수 있습니다. 소스를 신뢰하는 경우 반드시 JavaScript Overlay Types를 사용해야합니다. JSONParser를 통해 JSON을 파싱하는 것은 PITA입니다 (소스가 신뢰할 수없는 경우에는 필요합니다. /). –

답변

16

:이 같은 보일 것이다/(테스트되지 않은 코드를,하지만 당신은 일반적인 생각을해야한다) :
는 사실, 좀 더 복잡한의

JSONValue jsonValue; 
JSONArray jsonArray; 
JSONObject jsonObject; 
JSONString jsonString; 
jsonValue = JSONParser.parseStrict(incomingJsonRespone); 
// parseStrict is available in GWT >=2.1 
// But without it, GWT is just internally calling eval() 
// which is strongly discouraged for untrusted sources 

if ((jsonObject = jsonValue.isObject()) == null) { 
    Window.alert("Error parsing the JSON"); 
    // Possibilites: error during download, 
    // someone trying to break the application, etc. 
} 

jsonValue = jsonObject.get("d"); // Actually, this needs 
           // a null check too 
if ((jsonArray = jsonValue.isArray()) == null) { 
    Window.alert("Error parsing the JSON"); 
} 

jsonValue = jsonArray.get(0); 
if ((jsonObject = jsonValue.isObject()) == null) { 
    Window.alert("Error parsing the JSON"); 
} 

jsonValue = jsonObject.get("Desc"); 
if ((jsonString = jsonValue.isString()) == null) { 
    Window.alert("Error parsing the JSON"); 
} 

Window.alert(jsonString.stringValue()); // Finally! 

당신이 볼 수 있듯이, JSONParser을 사용할 때 매우 신중해야합니다. 전체적으로 요점은 무엇입니까? 안전하지 않은 JSON을 구문 분석하려면 (그렇지 않으면 주석에서 제안한 것처럼 JavaScript Overlay Types과 함께 가야합니다). JSONValue을 얻고, 그것이 실제로 무엇이라고 생각 하는지를 확인하십시오. 예를 들어, JSONObject 일 경우, JSONObject을 얻고, "xyz"키가 있는지 확인하고 JSONValue을 구하고 헹구고 반복하십시오. 아니 가장 흥미로운 작업을하지만, 최소한의 안전 다만주의
전체 JSON :)에 eval()를 호출하는 대신 : 제이슨 지적는, GWT 2.1 이전에, JSONParser 내부적 eval()을 사용 (단지했던 parse() 방법 - GWT 2.0 javadocs vs GWT 2.1). GWT 2.1에서 parse()은 더 이상 사용되지 않으며 parseLenient() (내부적으로 eval()을 사용)과 parseStrict() (안전한 방법)의 두 가지 메소드가 도입되었습니다. JSONParser을 사용해야한다면 GSO 2.1 M 2로 업그레이드하는 것이 좋습니다. 그렇지 않으면 JSO를 사용할 수 있기 때문입니다. 신뢰할 수없는 출처의 경우 JSONParser 대신 json2.js as a JSON parser via JSNI을 사용해보세요.

PS : JSONParser.parseJSONValue의 반환 형식이 아닌 JSONArray 때문에 cinqoTimo이 JSONArray jsonValue = JSONParser.parse(incomingJsonRespone); 분명히 작동하지 않습니다 - 당신의 IDE (이클립스 + Google 플러그인?) 경고하지 않았다을? 또는 적어도 컴파일러.

+1

신뢰할 수없는/임의의 JSON에 대해'JSONParser'의'parseStrict()'메서드를 사용하십시오 :"주의! 효율성을 위해서,이 메서드는 임의의 스크립트를 실행할 수있는 JavaScript'eval()'함수를 사용하여 구현됩니다 이 방법에 신뢰할 수없는 문자열을 전달하지 마십시오. " (http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/json/client/JSONParser.java에서) –

+0

흠, 나는 아래에있었습니다. 'JSONParser'가 좀 더 안전한 접근법을 사용했다는 느낌 ...'parseStrict()'를 제안하려고했지만 GWT 2.1에서 소개 되었기 때문에 OP가 아직 사용할 수 없을 수도 있습니다. 그러나 Jason의 의견에 비추어 볼 때, GWT 2.1 M2로 업그레이드하고'parseStrict()'를 사용하는 것이 가장 좋습니다. 그렇지 않으면'JSONParser'는 JSO보다 거의 이점이 없습니다. –

+0

코드가 정확하지는 않지만 올바른 아이디어입니다. 감사합니다 – tpow

2

배열이없는 것처럼 보이지만 'd'라는 속성이 배열 인 단일 루트 개체가있는 것 같습니다. 특정 API에 익숙하지 않지만 배열 대신 JSONObject 또는 유사 검색을 시도해 볼 수 있습니까? RMorrisey의 의견에 대응

+0

감사합니다. 나는 당신이 말하는 것을 보았습니다. 이를 JSONObject로 구문 분석 한 다음 JSONArray로 구문 분석합니까? 또는 JSONObject에서 문자열 값에 직접 액세스 할 수 있습니까? – tpow

+0

사용중인 JSONParser 라이브러리에 대한 API 문서에 대한 링크가 있습니까? – RMorrisey

+1

적절한 호출이 무엇인지 모르겠지만 JSONParser.parse (incomingJsonResponse) .getObject ("d"). getArray() 또는 JSONParser.parse (incomingJsonResponse) .getArray (" d ") – RMorrisey