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

Java 如何将Jackson PrettyPrinter格式json配置为Gson,java,json,jackson,Java,Json,Jackson,Jackson DefaultPrettyPrinter格式json as { "field" : [ 1, 2 ] } 如何将其配置为在冒号前不留空格的情况下格式化json,并使数组的每个元素都像GSON一样从新行开始 { "field": [ 1, 2 ] } 我指出的被骗者有一点旧的信息。我是通过配置DefaultPrettyPrinter实现的: ObjectMapper om = new ObjectMapper(

Jackson DefaultPrettyPrinter格式json as

{
  "field" : [ 1, 2 ]
}
如何将其配置为在冒号前不留空格的情况下格式化json,并使数组的每个元素都像GSON一样从新行开始

{
  "field": [
    1,
    2
  ]
}

我指出的被骗者有一点旧的信息。我是通过配置
DefaultPrettyPrinter
实现的:

ObjectMapper om = new ObjectMapper();
DefaultPrettyPrinter dpp = new DefaultPrettyPrinter();
dpp.indentArraysWith(new DefaultIndenter("  ", "\n"));
om.setDefaultPrettyPrinter(dpp);

我实现了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('}');
    }
}


需要使用分隔符覆盖
,以删除冒号前的空格。重写
writeEndArray
writeEndObject
是为了删除空数组和空对象中的空间
[]
{}
您最终必须配置写入程序

ObjectMapper mapper = new ObjectMapper();
String String = "{\"field\" : [ 1, 2 ]}";
Object obj = mapper.readValue(String, Object.class);

DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
prettyPrinter.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);

System.out.println(mapper.writer(prettyPrinter).writeValueAsString(obj));

输出

{
  "field" : [
    1,
    2
  ]
}


`mapper.writerWithDefaultPrettyPrinter().writeValueAsString(…)`?@pirho
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(…)
格式与我在问题
“字段”中写的格式完全相同:[1,2]
这是否回答了你的问题?看一看,谢谢。这几乎是我所需要的。但我还想删除冒号前的空格。另外,它将空数组打印为
[]
,但我想要
[]
。这只解决了数组格式问题,但我还需要删除冒号前的空格。