2013-05-28 3 views
59

나는 잭슨 org.json에서 내 JSON 라이브러리를 변경하고 난 다음 코드 마이그레이션 할 : 나는 다음과 같은 한 잭슨 이제JsonNode를 형 변환하지 않고 ArrayNode로 변환하는 방법은?

JSONObject datasets = readJSON(new URL(DATASETS)); 
JSONArray datasetArray = datasets.getJSONArray("datasets"); 

을 :

ObjectMapper m = new ObjectMapper(); 
JsonNode datasets = m.readTree(new URL(DATASETS));  
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets"); 

내가 안하지만 거기 던지기 같이, ClassCastException의 가능성은 있습니까? I 적절한 오류가 배열이 아닌 경우에는 취급이되도록 org.jsongetJSONArray하는 방법 당량이 있는가?

+0

불행하게도 나는 전체 매핑을 사용할 수 없습니다. 필드 이름이 제한된에서 온 –

+1

경우에 당신은 그들 모두를 특징으로 클래스를 정의하고, 다만 널 (null)이 사용되지 않는 필드에 반환 얻을 수있는 디시리얼라이저의'FAIL_ON_UNKNOWN_PROPERTIES' 기능을 사용할 수 있습니다. 그러나 필드 이름 집합이 상대적으로 제한적이라면 이는 물론 선택 사항입니다. – fvu

+0

흠 나는이 솔루션이 내 경우에 가장 적합하지 않다고 생각하지만 사전에 알려진 제한된 세트로 문제가 발생할 경우를 대비하여 기억할 것입니다! –

답변

146

예, 잭슨 수동 파서 디자인은 다른 라이브러리는 매우 다르다. 특히 JsonNode에는 일반적으로 다른 API의 배열 노드와 관련된 대부분의 기능이 있습니다. 따라서 사용하려면 ArrayNode으로 전송할 필요가 없습니다.

JSON :

{ 
    "objects" : ["One", "Two", "Three"] 
} 

코드 :

final String json = "{\"objects\" : [\"One\", \"Two\", \"Three\"]}"; 

final JsonNode arrNode = new ObjectMapper().readTree(json).get("objects"); 
if (arrNode.isArray()) { 
    for (final JsonNode objNode : arrNode) { 
     System.out.println(objNode); 
    } 
} 

출력 :

"여기 예입니다 한 "
"2 "
"세 "

isArray의 사용은 노드가 실제로 반복하기 전에 배열입니다 있는지 확인합니다. 데이터 구조에 절대적으로 확신이 있지만 필요하면 사용할 수 있습니다 (대부분의 다른 JSON 라이브러리와 다르지 않습니다). 데이터 필드 이름을 고정하지 않기 때문에

+1

시간이 절약되었습니다. 감사! –

1

배열이 아닌 경우 올바른 처리를 처리 할 수 ​​있도록 org.json의 getJSONArray와 동일한 메소드가 있습니까?

그것은 당신의 입력에 따라 달라집니다; 즉 URL에서 가져온 것들. "datasets"속성의 값이 일반 배열이 아닌 연관 배열이면 ClassCastException이됩니다.

그러나 이전 버전 도 마찬가지로의 정확성은 입력에 따라 다릅니다. 새 버전은 ClassCastException을 던지는 상황에서, 이전 버전 JSONException 발생합니다. 참조 : http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)

+0

아아아, 그냥 ClassCastException을 잡을 수있었습니다. 감사합니다!내 취향에 따라 특정 JsonException을 갖는 것보다 다소 덜 우아하지만 달리 가능하지 않은 경우 여전히 훌륭합니다. –

관련 문제