首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jackson解析器将JSON数组转换为HashMap<String、Object>

使用jackson解析器将JSON数组转换为HashMap<String、Object>
EN

Stack Overflow用户
提问于 2015-04-20 12:45:06
回答 2查看 1.8K关注 0票数 1

我正在使用: import com.fasterxml.jackson.databind.*

我有一个json数组:

代码语言:javascript
复制
{"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数组)。

EN

回答 2

Stack Overflow用户

发布于 2015-04-20 13:07:43

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

代码语言:javascript
复制
{    
 "decision1422461296135":{"text":"hello"},  
 "Action1422461296640":  {"text":"Action"},  
 "prompt1422461298089":  {"text":"Prompt"}
}

Nodes类可能如下所示:

代码语言:javascript
复制
public class Nodes {
    private Map<String,Node> nodesMap;
}
票数 1
EN

Stack Overflow用户

发布于 2015-04-20 18:44:54

在仔细研究了Jackson序列化程序的内部机制之后,下面是您想要的版本:

代码语言:javascript
复制
@JsonDeserialize(using = NodeDeserializer.class)
public class Nodes {
    private Map<String, Node> nodesMap;
    //getter/setter
}

序列化程序:

代码语言:javascript
复制
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试过了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29739487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档