杰克逊 - 递归解析为Map< String,Object> [英] Jackson - Recursive parsing into Map<String, Object>
问题描述
我正在尝试简化我的代码:我想存储键和值(所有字符串)。
I'm trying to simplify my code: I want to store key and values (all strings).
我实际上正在使用 Map< String,Object>
来存储它。帽子方式对象
可以是一个值( String
)或一个新节点( Map< String ,对象>
)。
I'm actually using a Map<String, Object>
to store it. hat way Object
could be a value (String
) or a new node (Map<String, Object>
).
我如何简化此代码?
递归函数会很好。
How could I simplify this code? A recursive function would be good.
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<String, Object>());
while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
String subkey = jsonParser.getCurrentName();
jsonParser.nextToken();
if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) {
Map<String, Object> subdata = (Map<String, Object>) mData.get(key);
subdata.put(subkey, new HashMap<String, Object>());
while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
String subsubkey = jsonParser.getCurrentName();
jsonParser.nextToken();
Map<String, Object> subsubdata = (Map<String, Object>) 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< String,Object>
,有一种更简单的方法可以用Jackson做到这一点。使用 ObjectMapper
:
Assuming that your end goal is just to deserialize JSON into a Map<String, Object>
, there is a far simpler way to do this with Jackson. Using ObjectMapper
:
final String json = "{}";
final ObjectMapper mapper = new ObjectMapper();
final MapType type = mapper.getTypeFactory().constructMapType(
Map.class, String.class, Object.class);
final Map<String, Object> data = mapper.readValue(json, type);
您将需要错误处理等,但这是一个很好的起点。
You will need error handling etc, but this is a good starting point.
这篇关于杰克逊 - 递归解析为Map< String,Object>的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!