栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用杰克逊序列化递归对象达一定深度

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用杰克逊序列化递归对象达一定深度

您需要实现自定义序列化程序,在其中需要计算已经处理的

Node
对象的数量。对于每个序列化过程,我们需要在
maxdepth
每次
Node
发现类时提供值并递减值。示例实现:

import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.BeanDescription;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.ObjectWriter;import com.fasterxml.jackson.databind.SerializationConfig;import com.fasterxml.jackson.databind.SerializationFeature;import com.fasterxml.jackson.databind.SerializerProvider;import com.fasterxml.jackson.databind.json.JsonMapper;import com.fasterxml.jackson.databind.module.SimpleModule;import com.fasterxml.jackson.databind.ser.BeanSerializer;import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;import com.fasterxml.jackson.databind.ser.std.BeanSerializerbase;import java.io.IOException;import java.util.concurrent.atomic.AtomicInteger;public class JsonApp {    public static void main(String[] args) throws IOException {        Node nodeD = new Node("D", null);        Node nodeC = new Node("C", nodeD);        Node nodeB = new Node("B", nodeC);        Node nodeA = new Node("A", nodeB);        for (int i = 0; i < 4; i++) { System.out.println("Depth: " + i); System.out.println(serialiseWithDepth(nodeA, i));        }    }    private static ObjectMapper mapper = JsonMapper.builder() .enable(SerializationFeature.INDENT_OUTPUT) .addModule(createNodeModule()) .build();    private static String serialiseWithDepth(Node node, int maxDepth) throws JsonProcessingException {        ObjectWriter writer = mapper.writerFor(Node.class)     .withAttribute(NodeDepthBeanSerializer.DEPTH_KEY, new AtomicInteger(maxDepth));        return writer.writevalueAsString(node);    }    private static SimpleModule createNodeModule() {        SimpleModule nodeModule = new SimpleModule("NodeModule");        nodeModule.setSerializerModifier(new BeanSerializerModifier() { @Override public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {     if (beanDesc.getBeanClass() == Node.class) {         return new NodeDepthBeanSerializer((BeanSerializerbase) serializer);     }     return super.modifySerializer(config, beanDesc, serializer); }        });        return nodeModule;    }}class NodeDepthBeanSerializer extends BeanSerializer {    public static final String DEPTH_KEY = "maxDepthSize";    public NodeDepthBeanSerializer(BeanSerializerbase src) {        super(src);    }    @Override    protected void serializeFields(Object bean, JsonGenerator gen, SerializerProvider provider) throws IOException {        AtomicInteger depth = (AtomicInteger) provider.getAttribute(DEPTH_KEY);        if (depth.decrementAndGet() >= 0) { super.serializeFields(bean, gen, provider);        }    }}

上面的代码打印:

Depth: 0Node{id='A', child=Node{id='B', child=Node{id='C', child=Node{id='D', child=null}}}} => 0{ }Depth: 1Node{id='A', child=Node{id='B', child=Node{id='C', child=Node{id='D', child=null}}}} => 1Node{id='B', child=Node{id='C', child=Node{id='D', child=null}}} => 0{  "id" : "A",  "child" : { }}Depth: 2Node{id='A', child=Node{id='B', child=Node{id='C', child=Node{id='D', child=null}}}} => 2Node{id='B', child=Node{id='C', child=Node{id='D', child=null}}} => 1Node{id='C', child=Node{id='D', child=null}} => 0{  "id" : "A",  "child" : {    "id" : "B",    "child" : { }  }}Depth: 3Node{id='A', child=Node{id='B', child=Node{id='C', child=Node{id='D', child=null}}}} => 3Node{id='B', child=Node{id='C', child=Node{id='D', child=null}}} => 2Node{id='C', child=Node{id='D', child=null}} => 1Node{id='D', child=null} => 0{  "id" : "A",  "child" : {    "id" : "B",    "child" : {      "id" : "C",      "child" : { }    }  }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/516122.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号