如何将 Jackson PrettyPrinter 格式 json 配置为 Gson

ant*_*ton 3 java json jackson

Jackson DefaultPrettyPrinter 将 json 格式设置为

{
  "field" : [ 1, 2 ]
}
Run Code Online (Sandbox Code Playgroud)

如何将其配置为格式化 json,冒号前不带空格,并且数组的每个元素像 GSON 一样从新行开始?

{
  "field": [
    1,
    2
  ]
}
Run Code Online (Sandbox Code Playgroud)

ant*_*ton 7

我实现了 PrettyPrinter ,它格式化 json 与 GSON 完全相同

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.util.DefaultIndenter;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import com.fasterxml.jackson.core.util.Separators;

import java.io.IOException;


public class MyPrettyPrinter extends DefaultPrettyPrinter {

    public MyPrettyPrinter() {
        _arrayIndenter = DefaultIndenter.SYSTEM_LINEFEED_INSTANCE;
        _objectIndenter = DefaultIndenter.SYSTEM_LINEFEED_INSTANCE;
    }

    public MyPrettyPrinter(DefaultPrettyPrinter base) {
        super(base);
    }

    @Override
    public MyPrettyPrinter createInstance() {
        if (getClass() != MyPrettyPrinter.class) {
            throw new IllegalStateException("Failed `createInstance()`: " + getClass().getName()
                    + " does not override method; it has to");
        }
        return new MyPrettyPrinter(this);
    }

    @Override
    public MyPrettyPrinter withSeparators(Separators separators) {
        this._separators = separators;
        this._objectFieldValueSeparatorWithSpaces = separators.getObjectFieldValueSeparator() + " ";
        return this;
    }

    @Override
    public void writeEndArray(JsonGenerator g, int nrOfValues) throws IOException {
        if (!_arrayIndenter.isInline()) {
            --_nesting;
        }
        if (nrOfValues > 0) {
            _arrayIndenter.writeIndentation(g, _nesting);
        }
        g.writeRaw(']');
    }

    @Override
    public void writeEndObject(JsonGenerator g, int nrOfEntries) throws IOException {
        if (!_objectIndenter.isInline()) {
            --_nesting;
        }
        if (nrOfEntries > 0) {
            _objectIndenter.writeIndentation(g, _nesting);
        }
        g.writeRaw('}');
    }
}

Run Code Online (Sandbox Code Playgroud)

withSeparators需要重写以删除冒号之前的空格。重写writeEndArrayandwriteEndObject用于删除空数组和空对象中的空间[] {}