jackson – 递归解析为Map
我正在尝试简化我的代码:我想存储键和值(所有字符串)。
我实际上使用Map
来存储它。 hat way Object
可以是值( String
)或新节点( Map
)。
我怎么能简化这段代码? 递归函数会很好。
try { JsonParser jsonParser = new JsonFactory().createJsonParser(content); jsonParser.nextToken(); while (jsonParser.nextToken() != JsonToken.END_OBJECT) { jsonParser.nextToken(); if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) { while (jsonParser.nextToken() != JsonToken.END_OBJECT) { String key = jsonParser.getCurrentName(); jsonParser.nextToken(); if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) { mData.put(key, new HashMap()); while (jsonParser.nextToken() != JsonToken.END_OBJECT) { String subkey = jsonParser.getCurrentName(); jsonParser.nextToken(); if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) { Map subdata = (Map) mData.get(key); subdata.put(subkey, new HashMap()); while (jsonParser.nextToken() != JsonToken.END_OBJECT) { String subsubkey = jsonParser.getCurrentName(); jsonParser.nextToken(); Map subsubdata = (Map) subdata.get(subkey); LogHelper.d("data[" + key + "][" + subkey + "][" + subsubkey + "]=" + jsonParser.getText()); subsubdata.put(subsubkey, jsonParser.getText()); } } else { LogHelper.d("data[" + key + "]=" + jsonParser.getText()); mData.put(key, jsonParser.getText()); } } } else { LogHelper.d("data[" + key + "]=" + jsonParser.getText()); mData.put(key, jsonParser.getText()); } } } else { LogHelper.d("status=" + jsonParser.getText()); mStatus = jsonParser.getText(); } } } catch (IllegalArgumentException e) { error("0", "IllegalArgumentException: " + e.getMessage()); } catch (JsonParseException e) { error("0", "IOException: " + e.getMessage()); } catch (IOException e) { error("0", "IOException: " + e.getMessage()); }
假设你的最终目标只是将JSON反序列化为Map
,那么与Jackson相比,有一种更简单的方法。 使用ObjectMapper
:
final String json = "{}"; final ObjectMapper mapper = new ObjectMapper(); final MapType type = mapper.getTypeFactory().constructMapType( Map.class, String.class, Object.class); final Map data = mapper.readValue(json, type);
您将需要error handling等,但这是一个很好的起点。