2012-07-16 2 views
12

JSON 파일을 구문 분석하기 위해 Android 프로젝트에서 Jackson 1.9.5를 사용하고 있습니다.임의의 JSON 키가있는 Jackson ObjectMapper

지금까지 나는 어떤 문제가 없었으며, 미세 다음 코드를 사용하여 파일을 구문 분석 할 수있는 다음 DetailSchema 클래스는 원시적 형과 클래스의 혼합으로 구성되어

AssetManager mgr = getAssets(); 
ObjectMapper mapper = new ObjectMapper(); 

try { 
    InputStream ifp = mgr.open("detail_schema.json"); 
    schema = mapper.readValue(ifp, DetailSchema.class); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

. 지금 나는 다음과 같은 몇 가지 JSON을 구문 분석 할 문제로 실행 해요 :

나는 아마도 손 전지도 키를 알 수
"fields": { 
    "Suburb": "Paddington", 
    "State": "NSW", 
    "Post Code": "2074", 
    "Lollipop": "Foo Bar Haz" 
} 

(그들은 사용자 정의 할 수 있습니다). 따라서 관련 Java 클래스가 어떤 모습인지 잘 모르겠습니다.

즉,이 예를 들어, 그것은 같이 수 :

public class MyClass { 

    public String Suburb; 
    public String State; 
    public String PostCode; 
    public String Lollipop; 

} 

하지만이 JSON 파일의 또 다른 예를 들어 정확하지 않을 수 있습니다. 이상적으로 잭슨이 값을 NameValuePair과 같은 값으로 매핑하는 방법이 필요합니다. 자동 개체 매핑이이 경우 옵션이 아닐 수도 있습니다. 누군가이를 확인하거나 거부 할 수 있습니까?

답변

16

두 가지 옵션이 있습니다. 어느 쪽이든 readTree in ObjectMapper을 사용할 수 있으며, JsonNode을 반환합니다.

InputStream ifp = mgr.open("detail_schema.json"); 
JsonNode root = mapper.readTree(ifp); 
JsonNode fields = root.get("fields"); 
for (JsonNode children : fields.getElements()) { 
    // ... 
} 

그런 다음 수동으로 DetailSchema 객체를 구축하는 데 필요한 것 : 당신이 아이 노드를 얻을 값을 읽을 등등 수 있도록 JsonNode 작업하는 것은, 많은 나무와 협력 같다.

또는, 잭슨은 당신이 당신의 코드를 사용하는 거라고하는 경우에지도로 역 직렬화 할 수 있지만 MyClass의이 같은 곳이 될 것입니다 :

public class MyClass { 
    public Map<String, Object> fields; 

    // getter/setters 
} 

당신은 아마 String으로지도 값을 입력 할 수 있습니다 입력 내용이 json의 텍스트인지 확신 할 수 있습니다. (실제로 잭슨이 어떤 유형의 집행을하는지 모르겠다. 어쨌든 아무것도 허용하지 않을 것이다 ...)

+1

대단히 고마워! 지도는 제 목적을 위해 잘 작동합니다. – aaronsnoswell

+0

'Map'을 얻기 위해 실제로 커스텀 클래스를 사용할 필요는 없습니다. Jackson은'Map' 인터페이스의 구현에 직접 deserialize 할 수 있습니다. 예 :'Map jsonFields = mapper.readValue (ifp, HashMap .class)' – brianmearns

관련 문제