【问题标题】:How do I map to HashMap for array?如何映射到数组的 HashMap?
【发布时间】:2015-09-08 12:48:00
【问题描述】:

我有一个 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?

【问题讨论】:

  • HashMap ??
  • 您有不同类型的对象作为值。所以HashMap&lt;String, Object&gt; 可能会这样做。
  • 无论如何这是一个非常糟糕的方法。您最终将检查给定键的值是什么类型等。与其试图让它与 Map 一起工作,我会重新审视我的模型并制作它,以便我知道我将在不同的字段中获得什么类型.
  • 为什么会有如此不同的输入?没有人定义格式吗?

标签: java arrays json


【解决方案1】:

声明一个通用的HashMap,将String作为键,将对象作为值,因为您并不确切知道值的类型。

Map<String, Object>

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

【讨论】:

    【解决方案2】:

    使用Map&lt;String, Object&gt;。示例

    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());
            }
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      如果您提前知道您的 json 将始终具有相同的格式(String 键映射到 List&lt;String&gt;,无论是单个元素还是多个元素),那么您可以使用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 中的值创建一个数组,也可以使用单个元素。

      【讨论】:

      • 它可能并不总是List&lt;String&gt; Map&lt;String, Object&gt; 对我有用。
      • @user3306669 Map&lt;String, Object&gt; 将始终适用于任何 JSON 对象,因为它是最通用的结构。但是,当您将它们从地图中取出时,您必须强制转换它们。这很容易出错,这就是我采用ACCEPT_SINGLE_VALUE_AS_ARRAY 方法的原因。根据您的问题,我认为涵盖所有可能的 JSON 就足够了。无论如何,我很高兴你让它与Map&lt;String, Object&gt; 一起工作。从地图中检索值时要小心。
      【解决方案4】:

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

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

      【讨论】:

      • 这很好,但我个人不喜欢处理 Object 类,因为它不是类型安全的。这就是为什么我建议使用该资源,以便您可以将 JSON 转换为更具体的类。
      • 其实 JSON 输入可以是任何类型。根据输入类型,一些操作会继续。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2011-04-18
      相关资源
      最近更新 更多