2013-05-07 1 views
10

Java 데이터에 저장된 일부 데이터가 있으며 주어진 형식 (JSONObject)으로 반환해야합니다. 내 구현이 정상적으로 작동하지만 여전히 이클립스 (버전 : Juno Service Release 2)의 경고 메시지가 표시됩니다.Java의 JSON 및 제네릭 - 유형 안전 경고

유형 안전성 : put (Object, Object) 메서드는 원시 형식 HashMap에 속합니다.

public interface Element {...} 

public abstract class AbstractElement implements Element {...} 

public final class Way extends AbstractElement {...} 

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

import org.json.simple.JSONArray; 
import org.json.simple.JSONObject; 

public class WayToJsonConverter{ 
    ... 
    public JSONObject wayToJson(){ 
     JSONObject obj = new JSONObject(); 
     obj.put("id",way.getId()); 
     ... 
     return obj; 
    } 
    ... 
} 

문제가있는 줄은 다음과 같습니다 :

obj.put("id",way.getId());는이 문제를 해결하는 방법이 있나요 일반적인 유형의 HashMap은 "이것은 내 코드입니다

매개 변수가 있어야한다 다른 사람에게 문제를 추가하여 @SuppressWarnings("unchecked")을 추가 하시겠습니까?

+0

getId()의 반환 유형은 무엇입니까? – SudoRahul

+0

반환 형식은 다음과 같습니다. String –

+0

이 경우'obj.put ("id", way.getId());'에는 문제가 없습니다. 그 경고를주는 다른 줄이어야합니다! – SudoRahul

답변

15

JSONObject는 HashMap에서 상속 받습니까? 않는 경우, 아마도 다음과 같이이 된 JSONObject의 인스턴스를 선언해야 함을 의미 경고 :

JSONObject<String,Object> obj=new JSONObject<String,Object>(); 

업데이트 : 그것의 HashMap를 확장하지만 매개 변수를 지원하지 않습니다

public class JSONObject extends HashMap 

다음 된 JSONObject의 정의 봐 그 정의가

public class JSONObject<K,V> extends HashMap<K,V> 

경우 유형, 우리는 쓸 수

JSONObject<String,Object> obj=new JSONObject<String,Object>(); 

와 다른 라이브러리로 전환하거나 일반적인하기 위해이 라이브러리의 코드를 수정할 수없는 경우 더 이상 경고

+11

그 일을하려고 할 때 "JSONObject 유형이 일반이 아니며 인수 를 사용하여 매개 변수화 할 수 없습니다" –

+0

타사. 나는 그것이 HashMap의 확장 찾았지만, 클래스 정의의 형식 매개 변수가없는 –

+17

https://code.google.com/p/json-simple/를, 그래서 우리는 @SuppressWarnings를 추가하는 것보다 아무것도 아니라 할 수 없다 : 당신은 여기에서 찾을 수 있습니다 ("확인되지 않음") 여기에 ... – ltebean

2

이 생성되지 않습니다 put 메소드는 유일한 옵션은 래퍼를 작성하는 것 이 라이브러리는이를 사용하고 generics를 적절하게 지원합니다.

그래서 당신은 HashMap<String, Object>를 확장하고 Map<String, Object>을 구현하는 것 인 org.json.simple.JSONObject 포함됩니다 자신의 JSONObject 클래스를 가질 것이며, org.json.simple.JSONObject의 모든 메소드에 대한 전달 방법을 포함한다.

이 클래스에는 여전히 @SuppressWarnings("unchecked")을 넣어야하지만이 클래스에만 국한되며 나머지 모든 코드에는 일반 경고 또는 해당 경고가 표시되지 않습니다.

+1

난 아직도 내가 문제를 해결하지만, 이동되지 않은 suppressWarning를 사용해야하는 경우 그것. 지금은 모든 JSON 처리가 한 클래스에서 처리되므로 많은 도움이되지 않습니다. 또한, 구현하고있는 인터페이스의 일부 메소드에 JSONObject를 리턴해야합니다. Warping을 사용하면 어쨌든 도움이되지 않습니다. 이것은 주어진 JSON 패키지의 제한 사항 인 것처럼 보이며 더 나은 모양으로 만들 수 없습니다. 위의 경우에서 –

0

FYI org.codehaus.jettison.json.JSONObject은이 경고를 발생시키지 않습니다. codehaus 'JSONObject를 사용할 때 org.codehaus.jettison.json.JSONException을 통해 파싱 오류를 포착 할 수도 있습니다. 자세한 내용은 https://github.com/codehaus/jettison을 참조하십시오.

0

당신은지도 객체를 만들고 된 JSONObject

Map<String, String> obj = new HashMap<String, String>(); 
obj.put("id",way.getId()); 
JSONObject jsonObj = (JSONObject) obj; 

에 명시 적 캐스트를 수행하지만 당신은 당신의 JSON에서 "문자열"를 포함 제한 않습니다 수 있습니다. 다른 데이터 구조를 추가하면 컴파일 오류가 표시됩니다. 배열을 말해봐.

+0

추가 주석 – Kranthi

+0

"경고를 억제"할 필요가 없다 'java.util.HashMap에이 org.json.simple.JSONObject' –

0

또 다른 옵션은 (매개 변수화 된) Map<String, Object>으로 JSONObject을 초기화하는 것입니다. 그렇게하면 유효한 JSON 유형의 값이 될 수 있으므로 unchecked 경고는 피할 수 있습니다. 예 ::

public class WayToJsonConverter{ 
    ... 
    public JSONObject wayToJson(){ 
     Map<String, Object> forJsonObj = new HashMap<>(); 
     forJsonObj.put("id",way.getId()); // No warning, hurray! 
     forJsonObj.put("integer", 14); 
     forJsonObj.put("floating", 1.4); 
     JSONObject obj = new JSONObject(forJsonObj); 
     ... 
     return obj; 
    } 
    ... 
} 
+0

캐스트 할 수없는'JSONObject'는 어떤 매개 변수 생성자가 없습니다. –

+0

@ HarshPandey- 필자는 대답에서'JSONObject'의 매개 변수화 된 생성자를 사용하지 않습니다. – asherbar

+0

'JSONObject obj = 새 JSONObject (forJsonObj); ' 여기에 매개 변수화 된 생성자를 사용하고 있지 않습니까? –