簡體   English   中英

將JSON數組轉換為HashMap <String,Object> 使用傑克遜解析器

[英]Convert a JSON array to a HashMap<String,Object> using jackson parser

我正在使用: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 我不認為這是優化的。 我想在ObjectMapper解析JSON時創建HashMap (因此僅1個通過JSON數組傳遞)。

您可以按以下方式更改JSON結構:

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

而Nodes類可以如下所示:

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

在研究了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上嘗試過

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM