【问题标题】:How to configure Jackson PrettyPrinter format json as Gson如何将 Jackson PrettyPrinter 格式 json 配置为 Gson
【发布时间】:2020-11-03 20:11:46
【问题描述】:

Jackson DefaultPrettyPrinter 格式 json 为

{
  "field" : [ 1, 2 ]
}

如何配置它以格式化 json,冒号前没有空格,并且数组的每个元素都像 GSON 那样从新行开始?

{
  "field": [
    1,
    2
  ]
}

【问题讨论】:

标签: java json jackson


【解决方案1】:

我实现了与 GSON 完全一样格式化 json 的 PrettyPrinter

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('}');
    }
}

需要覆盖withSeparators 以删除冒号前的空格。覆盖writeEndArraywriteEndObject 用于删除空数组和空对象[] {} 中的空间。

【讨论】:

    【解决方案2】:

    我指出的骗子有一些旧信息。我是通过配置DefaultPrettyPrinter做到的:

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

    【讨论】:

    • 谢谢。这几乎是我所需要的。但我也想删除冒号前的空格。此外,它将一个空数组打印为[ ],但我想要[]
    【解决方案3】:

    您最终必须配置编写器,

    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
      ]
    }
    
    

    【讨论】:

    • 这只能解决数组格式问题,但我还需要删除冒号前的空格。
    猜你喜欢
    • 2014-08-04
    • 2019-09-23
    • 2018-05-05
    • 2020-09-11
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多