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

在Jackson中将JsonNode序列化为非常特定的JSON格式

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

在Jackson中将JsonNode序列化为非常特定的JSON格式

您可以自定义Jackson如何缩进输出。根据您使用的Jackson版本,有多种实现方法。

杰克逊2.5及更高版本

请执行下列操作:

DefaultPrettyPrinter printer = new DefaultPrettyPrinter();Indenter indenter = new DefaultIndenter();printer.indentObjectsWith(indenter); // Indent JSON objectsprinter.indentArraysWith(indenter);  // Indent JSON arraysObjectMapper mapper = new ObjectMapper();mapper.writer(printer).writevalue(new FileOutputStream(outputFile), node);

默认情况下,将使用2个空格。对于不同数量的空格,请使用

DefaultIndenter
接收字符串以缩进级别和行分隔符的构造函数:

Indenter indenter = new DefaultIndenter("      ", DefaultIndenter.SYS_LF);

杰克逊2.4及更低版本

请执行下列操作:

DefaultPrettyPrinter printer = new DefaultPrettyPrinter();Indenter indenter = new Lf2SpacesIndenter();printer.indentObjectsWith(indenter); // Indent JSON objectsprinter.indentArraysWith(indenter);  // Indent JSON arraysObjectMapper mapper = new ObjectMapper();mapper.writer(printer).writevalue(new FileOutputStream(outputFile), node);

Lf2SpacesIndenter
被限制在2个空格,你不能改变它。

如果需要不同数量的空格,则需要编写自定义实现。这是使用与

DefaultIndenter
Jackson
2.5中引入的代码相同的代码的代码:

public class CustomSpaceIndenter extends DefaultPrettyPrinter.NopIndenter {    public final static String SYS_LF;    static {        String lf;        try { lf = System.getProperty("line.separator");        } catch (Throwable t) { lf = "n"; // fallback when security manager denies access        }        SYS_LF = lf;    }    public static final CustomSpaceIndenter SYSTEM_LINEFEED_INSTANCE =  new CustomSpaceIndenter("  ", SYS_LF);        private final static int INDENT_LEVELS = 16;    private final char[] indents;    private final int charsPerLevel;    private final String eol;        public CustomSpaceIndenter() {        this("  ", SYS_LF);    }        public CustomSpaceIndenter(String indent, String eol)  {        charsPerLevel = indent.length();        indents = new char[indent.length() * INDENT_LEVELS];        int offset = 0;        for (int i=0; i<INDENT_LEVELS; i++) { indent.getChars(0, indent.length(), indents, offset); offset += indent.length();        }        this.eol = eol;    }    public CustomSpaceIndenter withLinefeed(String lf) {        if (lf.equals(eol)) { return this;        }        return new CustomSpaceIndenter(getIndent(), lf);    }    public CustomSpaceIndenter withIndent(String indent) {        if (indent.equals(getIndent())) { return this;        }        return new CustomSpaceIndenter(indent, eol);    }    public String getEol() {        return eol;    }    public String getIndent() {        return new String(indents, 0, charsPerLevel);    }    @Override    public boolean isInline() {         return false;    }    @Override    public void writeIndentation(JsonGenerator jg, int level) throws IOException {        jg.writeRaw(eol);        if (level > 0) { // should we err on negative values (as there's some flaw?) level *= charsPerLevel; while (level > indents.length) { // unlike to happen but just in case     jg.writeRaw(indents, 0, indents.length);      level -= indents.length; } jg.writeRaw(indents, 0, level);        }    }}

可以如下使用:

Indenter indenter = new CustomSpaceIndenter("      ", CustomSpaceIndenter.SYS_LF);


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

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

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