Jackson:反序列化时保留对映射值中键的引用

埃涅斯库

我有以下 JSON,其中包含从用户 ID 到用户详细信息的映射:

{
    "users": {
        "john": { "firstName": "John", "lastName": "Doe" },
        "mark": { "firstName": "Mark", "lastName": "Smith" }
    }
}

我正在使用以下代码将 JSON 反序列化为 Java 对象:

class User {
    public String userID;

    public String firstName;
    public String lastName;
}

public class Users {
    public Map<String, User> users;

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        Reader source = Files.newBufferedReader(Paths.get("test.json"));
        Users all = mapper.readValue(source, Users.class);
        // ...
    }
}

反序列化后,我希望将字段User.userID设置为users映射中的相应键

例如all.users.get("john").userID应该是"john"

我怎样才能做到这一点?

约翰16384

为 User 对象创建一个自定义反序列化器,并将其用于 Map。这是一个完整的例子:

@Test
public void test() throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();

    Data data = mapper.readValue("{\"users\": {\"John\": {\"id\": 20}, \"Pete\": {\"id\": 30}}}", Data.class);

    assertEquals(20, data.users.get("John").id);
    assertEquals(30, data.users.get("Pete").id);
    assertEquals("John", data.users.get("John").name);
    assertEquals("Pete", data.users.get("Pete").name);
}

public static class Data {
    @JsonDeserialize(contentUsing = Deser.class)
    public Map<String, User> users;
}

public static class User {
    public String name;
    public int id;
}

public static class Deser extends JsonDeserializer<User> {

    @Override
    public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        String name = ctxt.getParser().getCurrentName();

        User user = p.readValueAs(User.class);

        user.name = name;  // This copies the key name to the user object

        return user;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

反序列化时的Jackson JSON异常

来自分类Dev

使用Jackson的@JsonTypeInfo反序列化时,如何保留type属性?

来自分类Dev

反序列化时,可以使用映射的Jackson Mixin属性创建JSON子类吗?

来自分类Dev

在反序列化时跳过无效值

来自分类Dev

在反序列化时跳过无效值

来自分类Dev

反序列化时,如果json中不存在旧值,请保留

来自分类Dev

JPA / Jackson-反序列化时排除字段,序列化时将其包括在内

来自分类Dev

反序列化时重新映射单个标签

来自分类Dev

使用“键”和“值”属性反序列化JSON映射不适用于Jackson

来自分类Dev

反序列化时出错

来自分类Dev

使用Jackson进行序列化时解决循环引用:双向

来自分类Dev

从JSON反序列化时,可以限制可能的值吗?

来自分类Dev

Jackson反序列化-Kotlin数据类-每个映射器缺少字段的默认值

来自分类Dev

使用 Jackson 将 Y/N 映射到真/假布尔值将 XML 反序列化为对象

来自分类Dev

通过使用密钥作为值反序列化Jackson

来自分类Dev

使用Jackson进行反序列化时,如何放松命名策略?

来自分类Dev

Java Jackson-反序列化时防止将float转换为int

来自分类Dev

使用Jackson进行反序列化时有选择地忽略JSON属性

来自分类Dev

在Jackson 2注释中反序列化时如何在JSON中省略包装对象

来自分类Dev

反序列化的对象是否保留静态值?

来自分类Dev

使用json.net反序列化时是否保留数组顺序?

来自分类Dev

在Java中序列化和反序列化后如何保留引用?

来自分类Dev

反序列化时的备用属性名称

来自分类Dev

反序列化时字典为空

来自分类Dev

反序列化时的xstream转换异常

来自分类Dev

反序列化时无效的JSON原语

来自分类Dev

反序列化时的备用属性名称

来自分类Dev

反序列化时的xstream转换异常

来自分类Dev

反序列化时的gcc / clang优化

Related 相关文章

  1. 1

    反序列化时的Jackson JSON异常

  2. 2

    使用Jackson的@JsonTypeInfo反序列化时,如何保留type属性?

  3. 3

    反序列化时,可以使用映射的Jackson Mixin属性创建JSON子类吗?

  4. 4

    在反序列化时跳过无效值

  5. 5

    在反序列化时跳过无效值

  6. 6

    反序列化时,如果json中不存在旧值,请保留

  7. 7

    JPA / Jackson-反序列化时排除字段,序列化时将其包括在内

  8. 8

    反序列化时重新映射单个标签

  9. 9

    使用“键”和“值”属性反序列化JSON映射不适用于Jackson

  10. 10

    反序列化时出错

  11. 11

    使用Jackson进行序列化时解决循环引用:双向

  12. 12

    从JSON反序列化时,可以限制可能的值吗?

  13. 13

    Jackson反序列化-Kotlin数据类-每个映射器缺少字段的默认值

  14. 14

    使用 Jackson 将 Y/N 映射到真/假布尔值将 XML 反序列化为对象

  15. 15

    通过使用密钥作为值反序列化Jackson

  16. 16

    使用Jackson进行反序列化时,如何放松命名策略?

  17. 17

    Java Jackson-反序列化时防止将float转换为int

  18. 18

    使用Jackson进行反序列化时有选择地忽略JSON属性

  19. 19

    在Jackson 2注释中反序列化时如何在JSON中省略包装对象

  20. 20

    反序列化的对象是否保留静态值?

  21. 21

    使用json.net反序列化时是否保留数组顺序?

  22. 22

    在Java中序列化和反序列化后如何保留引用?

  23. 23

    反序列化时的备用属性名称

  24. 24

    反序列化时字典为空

  25. 25

    反序列化时的xstream转换异常

  26. 26

    反序列化时无效的JSON原语

  27. 27

    反序列化时的备用属性名称

  28. 28

    反序列化时的xstream转换异常

  29. 29

    反序列化时的gcc / clang优化

热门标签

归档