有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在JSON反序列化期间将引用转换为实例

这是一个问题,但已经解决了。我试图将一些JSON数据反序列化到Java POJO中。例如,以以下JSON数据为例:

对于Account数据,我有以下JSON数据,它通过用户id引用用户:

{
  "name" : "Bob's Account",
  "roles": {
    "administrator" : "user-1",
    "owner"         : "user-1",
    "participant"   : "user-2" 
  }
}

对于User的'Bob'和'Alice'我有以下JSON数据:

{
  "name": "Bob",
  "id"  : "user-1"
}
{
  "name": "Alice",
  "id"  : "user-2"
}

我想要实现的是将数据反序列化为以下Java类:

import java.util.Map;
import java.util.HashMap;

public class Account {
  String name;
  Map<String, User> roles = new HashMap<>();
}

public class User {
  String id;
  String name;
}

注意Account类有一个映射,它将String链接到一个User实例


共 (1) 个答案

  1. # 1 楼答案

    为此,您必须在Account对象中注释属性roles,如下所示:

      ⋯snip⋯
      @JsonDeserialize(contentConverter = UserReferenceConverter.class)
      Map<String, User> roles = new HashMap<>();
      ⋯snip⋯
    

    然后用create a UserReferenceConverterString形式的用户id转换为实际的User实例enter code here

    public class UserReferenceConverter extends StdConverter<String, User> {
      
      @Override
      public User convert( String value ) {
        // Get the user...
        return UserRepository.getUserById( value );
      }
    }
    

    要从JSON字符串加载Account,请运行以下命令:

    import com.fasterxml.jackson.databind.ObjectMapper;
    
      ⋯snip⋯
      ObjectMapper mapper = new ObjectMapper();
      Account account = mapper.readValue(json, Account.class);
      ⋯snip⋯