使用jackson解析器</string,object>将JSON数组转换为HashMap <string,object>

时间:2015-04-20 04:45:06

标签: java hashmap jackson

我正在使用: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和text字段的POJO。

我宁愿不使用任何其他外部库。

现在我正在将JSON array转换为Array of Nodes,然后遍历数组以创建我想要的HashMap。我不认为这是优化的。我希望在HashMap解析JSON时创建ObjectMapper(所以只需1次通过JSON数组)。

2 个答案:

答案 0 :(得分:1)

您可以按如下方式更改JSON结构:

{    
 "decision1422461296135":{"text":"hello"},  
 "Action1422461296640":  {"text":"Action"},  
 "prompt1422461298089":  {"text":"Prompt"}
}

Nodes类看起来如下所示:

public class Nodes {
    private Map<String,Node> nodesMap;
}

答案 1 :(得分:0)

在挖掘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,它工作正常。我用杰克逊2.5.2试了一下