2012-07-31 125 views
3

我想解析一個本地JSON文件並使用RestTemplate將其編組爲模型,但不能分辨這是否可能。使用RestTemplate解析本地JSON文件

我正試圖在使用RestTemplate與服務器同步的Android應用上預先填充數據庫。我想,爲什麼不使用RestTemplate?而不是自己解析本地的JSON?它完全用於將JSON解析爲模型。

但是......我無法從文檔中知道是否有任何方法可以做到這一點。有MappingJacksonHttpMessageConverter類看起來將服務器的http響應轉換爲模型...但有什麼辦法破解,以處理本地文件?我試了一下,但是一直在越來越深的兔洞裏跑,沒有運氣。

回答

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()這需要兩個參數:ClassHttpInputMessage

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

有了這個方法,你可以閱讀從單一的JSON消息單個對象,但YourClazz可以有一些收藏。

接下來,你必須創建你自己的HttpInputMessage實現,在這個例子中它期望json作爲字符串,但你可能可以將流傳遞給你的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; 
    } 

} 

PS。 You can publish your app with database

+0

感謝您的好解答。我試過這個方法,但不斷收到一個異常'無法反序列化...的實例'。我找到了一個更好的解決方案,我將分享。 – 2012-07-31 22:50:20