2012-07-31 2 views
3

로컬 JSON 파일을 구문 분석하여 RestTemplate을 사용하여 모델로 마샬링하고 싶지만 가능하면이를 알 수 없습니다.RestTemplate을 사용하여 로컬 JSON 파일 구문 분석

서버와 동기화하기 위해 RestTemplate을 사용하는 Android 앱에 데이터베이스를 미리 채우려고합니다. 필자가 직접 로컬 JSON을 구문 분석하는 대신 RestTemplate을 사용하지 않는 이유는 무엇입니까? JSON을 모델로 파싱하기 위해 만들어졌습니다.

하지만 ...이 작업을 수행 할 수있는 방법이 있다면 문서에서 알 수 없습니다. 서버의 http 응답을 모델로 변환하는 것으로 보이는 MappingJacksonHttpMessageConverter 클래스가 있지만 로컬 파일을 사용하여 해킹 할 수있는 방법이 있습니까? 나는 노력했지만 운 좋게 토끼 구멍을 깊숙이 깊숙이 깊숙히 파고 들었다.

답변

3

알아 냈어. RestTemplate을 사용하는 대신 Jackson을 직접 사용할 수 있습니다. RestTemplate이이 작업에 참여해야하는 이유는 없습니다. 매우 간단합니다.

try { 
    ObjectMapper mapper = new ObjectMapper(); 

    InputStream jsonFileStream = context.getAssets().open("categories.json"); 

    Category[] categories = (Category[]) mapper.readValue(jsonFileStream, Category[].class); 

    Log.d(tag, "Found " + String.valueOf(categories.length) + " categories!!"); 
} catch (Exception e){ 
    Log.e(tag, "Exception", e); 
} 
1

네, 가능하다고 생각합니다 (MappingJacksonHttpMessageConverter 사용).

MappingJacksonHttpMessageConverter는 두 개의 매개 변수 소요 방법 read()있다 : 당신은 하나의 JSON 메시지에서 단일 개체를 읽을 수있는이 방법을 ClassHttpInputMessage

MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter(); 
YourClazz obj = (YourClazz) converter.read(YourClazz.class, new MyHttpInputMessage(myJsonString)); 

,하지만 YourClazz 몇 가지 수집 할 수 있습니다.

다음으로 HttpInputMessage 구현을 직접 작성해야합니다.이 예제에서는 json이 string으로 예상되지만 스트림을 json 파일로 전달할 수 있습니다.

public class MyHttpInputMessage implements HttpInputMessage { 

    private String jsonString; 

    public MyHttpInputMessage(String jsonString) { 
     this.jsonString = jsonString; 
    } 

    public HttpHeaders getHeaders() { 
     // no headers needed 
     return null; 
    } 

    public InputStream getBody() throws IOException { 
     InputStream is = new ByteArrayInputStream(
       jsonString.getBytes("UTF-8")); 
     return is; 
    } 

} 

추신. You can publish your app with database

+0

좋은 답변에 감사드립니다. 이 메서드를 시도했지만 '계속 인스턴스를 deserialize 할 수 없습니다.'예외가 계속 발생했습니다. 공유 할 더 나은 솔루션을 찾았습니다. –