【问题标题】:Jackson Json Object mapper : how to map an array?Jackson Json Object mapper:如何映射数组?
【发布时间】:2023-04-06 04:20:01
【问题描述】:

我正在尝试从后端 api 调用映射一个数组。我怎样才能知道这些数据:

以下类将用于保存 json 数组数据:

    @Data
    private static class UserListBean {
        private List<UserBean> userList;
    }

    @Data
    private static class UserBean {
        private String id;
        private String userName;
        private String password;
    }

json 将具有以下格式(以下示例仅包含一项):

[
   {
      "id":1,
      "userName":"bob",
      "password":"403437d5c3f70b1329f37a9ecce02adbbf3e986"
   }
]

我正在使用 Jackson,到目前为止我已经尝试了以下方法,但它不断向我发送异常

        final ObjectMapper mapper = new ObjectMapper();
        mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        final ObjectReader reader = mapper.reader(UserListBean.class);
        GeoHubAccountListBean accounts = null;

        try {
            accounts = reader.readValue(jsonString);
        } catch (final IOException ex) {
            log.error("Cannot convert JSON into a list of users", ex);
        }

这里final ObjectReader reader = mapper.reader(UserListBean.class);抛出异常

Can not deserialize instance of com.xxx.XXX$UserListBean out of START_ARRAY token

有什么想法吗?

谢谢

【问题讨论】:

    标签: json spring rest jackson datamapper


    【解决方案1】:

    好吧,如果您尝试将 json 反序列化为 UserListBean 类型的对象,那么您需要反序列化 JSONObject(Java 对象倾向于映射到 JSONObjects)。

    因此,您最外层的 json 构造应该是一个对象。您最外层的 json 构造是 JSONArray。

    您的UserListBean 有一个字段,即List&lt;UserBean&gt;。因此,您的顶级 json 构造(它是一个 JSONObject)应该包含一个名为“userList”的字段,其值是一个 JSONArray(Java 集合倾向于映射到 JSONArrays)。

    我认为这是您正在寻找的实际 json:

    {
      "userList":[
         {
           "id":1,
           "userName":"bob",
           "password":"403437d5c3f70b1329f37a9ecce02adbbf3e986"
         }
      ]
    }
    

    如果您无法控制传入的 json,那么您可能希望放弃父对象 UserListBean 并直接处理 List&lt;UserBean&gt;,因为这将适用于您提供的 json。

    【讨论】:

    • 但是如何在 mapper.reader 方法中使用 List 类?我的意思是:final ObjectReader reader = mapper.reader(??????);
    • 谢谢我是这样工作的,我只是通过 mapper.readValue(jsonString, new TypeReference>() {}); 直接映射到 List >
    【解决方案2】:

    尝试以下方法:

    public static <T> T mapFromJson(String json, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return objectMapper.readValue(json, clazz);
    }
    
    public static void main(String[] args) throws IOException {
        HeaVO HeaVO=new HearVO();
        HeaVO.setId("Id");
        List<HeaVO> listVO=new ArrayList<HeaVO>();
        listVO.add(HeaVO);
    
        List<HeaVO> listHeaVORes=Arrays.asList(mapFromJson(mapToJson(listHeaVO), HeaVO[].class));
        System.out.println(((HeaVO)listVORes.get(0)).getId());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      相关资源
      最近更新 更多