有 Java 编程相关的问题?

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


共 (1) 个答案

  1. # 1 楼答案

    #对象图的标准序列化

    让我们定义两个简单的实体,看看Jackson如何在没有任何自定义逻辑的情况下序列化这些实体:

    public class User {
        public int id;
        public String name;
    }
    public class Item {
        public int id;
        public String itemName;
        public User owner;
    }
    

    现在,让我们用一个用户实体序列化一个条目实体:

    Item myItem = new Item(1, "theItem", new User(2, "theUser"));
    String serialized = new ObjectMapper().writeValueAsString(myItem);
    

    这将导致两个实体的完整JSON表示:

    {
        "id": 1,
        "itemName": "theItem",
        "owner": {
            "id": 2,
            "name": "theUser"
        }
    }
    

    #ObjectMapper上的自定义序列化程序

    现在,让我们简化上面的JSON输出,只序列化用户id,而不是整个用户对象;我们希望得到以下更简单的JSON:

    {
        "id": 25,
        "itemName": "FEDUfRgS",
        "owner": 15
    }
    

    简单地说,我们必须为项对象定义一个自定义序列化程序:

    public class ItemSerializer extends StdSerializer<Item> {
        
        public ItemSerializer() {
            this(null);
        }
      
        public ItemSerializer(Class<Item> t) {
            super(t);
        }
    
        @Override
        public void serialize(
          Item value, JsonGenerator jgen, SerializerProvider provider) 
          throws IOException, JsonProcessingException {
     
            jgen.writeStartObject();
            jgen.writeNumberField("id", value.id);
            jgen.writeStringField("itemName", value.itemName);
            jgen.writeNumberField("owner", value.owner.id);
            jgen.writeEndObject();
        }
    }
    

    现在,我们需要向Item类的ObjectMapper注册这个自定义序列化程序,并执行序列化:

    Item myItem = new Item(1, "theItem", new User(2, "theUser"));
    ObjectMapper mapper = new ObjectMapper();
    
    SimpleModule module = new SimpleModule();
    module.addSerializer(Item.class, new ItemSerializer());
    mapper.registerModule(module);
    
    String serialized = mapper.writeValueAsString(myItem);
    

    就是这样——我们现在有了一个更简单的自定义JSON序列化项->;用户实体

    #类上的自定义序列化程序

    我们还可以直接在类上注册序列化程序,而不是在ObjectMapper上注册:

    @JsonSerialize(using = ItemSerializer.class)
    public class Item {
        ...
    }
    

    现在,在执行标准序列化时:

    Item myItem = new Item(1, "theItem", new User(2, "theUser"));
    String serialized = new ObjectMapper().writeValueAsString(myItem);
    

    我们将通过@JsonSerialize获得由序列化程序创建的自定义JSON输出:

    {
        "id": 25,
        "itemName": "FEDUfRgS",
        "owner": 15
    }
    

    当无法直接访问和配置ObjectMapper时,这非常有用