如何映射到HashMap的数组?

时间:2015-09-08 12:48:00

标签: java arrays json

我有一个JSON,我希望将其转换为HashMap。我有以下代码 -

ObjectMapper mapper = new ObjectMapper();
Map<String, String> jsonData = new HashMap<String, String>();

jsonData = mapper.readValue(userPropertyJson, new TypeReference<HashMap<String,String>>(){});

如果输入JSON是

,它工作正常
{"user":1, "entity": "email"}

但是当JSON如下时失败 -

{"user":1, "entity": ["email","fname","lname","phone"]}

如何映射HashMap for array?

4 个答案:

答案 0 :(得分:4)

使用HashMap作为键并将Object作为值声明通用String,因为您不完全知道值的类型。

Map<String, Object>

请注意在检索数据时分配错误的类型

答案 1 :(得分:2)

使用Map<String, Object>。实施例

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;


public class JacksonParser {

    public static void main(String[] args) {
        String userPropertyJson = "{\"user\":1, \"entity\": [\"email\",\"fname\",\"lname\",\"phone\"]}";
        ObjectMapper mapper = new ObjectMapper();
        try {
        Map<String, Object> jsonData = new HashMap<String, Object>();

        jsonData = mapper.readValue(userPropertyJson, new TypeReference<HashMap<String,Object>>(){});
        System.out.println(jsonData);
        } catch (JsonParseException e) {
        System.out.println(e.getMessage());
        } catch (JsonMappingException e) {
        System.out.println(e.getMessage());
        } catch (IOException e) {
        System.out.println(e.getMessage());
        }
    }

}

答案 2 :(得分:1)

如果您事先知道 ,那么您的json将始终具有相同的格式(String键映射到List<String>,无论是使用单个元素还是使用多个元素),然后您可以使用ACCEPT_SINGLE_VALUE_AS_ARRAY反序列化功能:

ObjectMapper mapper = new ObjectMapper()
    .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

String jsonWithArray = 
    "{\"user\": 1, \"entity\": [\"email\", \"fname\", \"lname\", \"phone\"]}";

Map<String, List<String>> map1 = 
    mapper.readValue(
        jsonWithArray,
        new TypeReference<HashMap<String, List<String>>>() {});

System.out.println(map1); // {user=[1], entity=[email, fname, lname, phone]}

String jsonWithoutArray = "{\"user\": 1, \"entity\": \"email\"}";

Map<String, List<String>> map2 = 
    mapper.readValue(
        jsonWithoutArray, 
        new TypeReference<HashMap<String, List<String>>>() {});

System.out.println(map2); // {user=[1], entity=[email]}

这使您可以为json中的值或单个元素创建一个数组。

答案 3 :(得分:1)

查看http://www.jsonschema2pojo.org/

它允许您自动将json转换为java对象。当我需要从没有java映射或SDK的Web服务创建DTO时,我会使用它。