我正在使用: import com.fasterxml.jackson.databind.*
我有一个json数组:
{"nodes":
[
{"blockId":"decision1422461296135","text":"hello"},
{"blockId":"Action1422461296640","text":"Action"},
{"blockId":"prompt1422461298089","text":"Prompt"}
]
}我想把上面的数组转换成一个HashMap< String,Node >,其中的关键字是blockId,Node是一个包含id和文本字段的POJO。
我不想使用任何其他的外部库。
现在,我正在将JSON array转换为Array of Nodes,然后遍历数组以创建我想要的HashMap。我不认为这是优化的。我希望在ObjectMapper解析JSON时创建HashMap (所以只有1次传递通过JSON数组)。
发布于 2015-04-20 13:07:43
您是否可以按如下方式更改JSON结构:
{
"decision1422461296135":{"text":"hello"},
"Action1422461296640": {"text":"Action"},
"prompt1422461298089": {"text":"Prompt"}
}Nodes类可能如下所示:
public class Nodes {
private Map<String,Node> nodesMap;
}发布于 2015-04-20 18:44:54
在仔细研究了Jackson序列化程序的内部机制之后,下面是您想要的版本:
@JsonDeserialize(using = NodeDeserializer.class)
public class Nodes {
private Map<String, Node> nodesMap;
//getter/setter
}序列化程序:
public class NodeDeserializer extends JsonDeserializer<Nodes> {
@Override
public Nodes deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
Map<String, Node> nodes = new HashMap<>();
p.getCurrentToken();//START_OBJECT
p.nextToken();//FIELD_NAME
p.nextToken();//START_ARRAY
p.nextToken();//START_OBJECT
while (p.getCurrentToken() != JsonToken.END_ARRAY) {
p.nextToken();//blockId field
p.nextToken();//blockId value
String id = p.getValueAsString();
p.nextToken();//text field
p.nextToken();//text value
String text = p.getValueAsString();
p.nextToken();//END_OBJECT
p.nextToken();//START_OBJECT?
nodes.put(id, new Node().setBlockId(id).setText(text));
}
return new Nodes().setNodesMap(nodes);
}
}这应该涵盖了您的请求。这个类被计算,而不是BeanDeserializer,并且它只迭代一次。
对于有效的json,它工作得很好。我用Jackson 2.5.2试过了
https://stackoverflow.com/questions/29739487
复制相似问题