【问题标题】:Jackson JSON Deserialization: array elements in each lineJackson JSON反序列化:每行中的数组元素
【发布时间】:2013-02-18 14:32:16
【问题描述】:

我正在使用Jackson 并希望漂亮地打印 JSON,以便数组中的每个元素都进入每一行,例如:

{ “富”:“酒吧”, “废话”:[ 1、 2、 3 ] }

设置SerializationFeature.INDENT_OUTPUT true 只为对象字段插入换行符,而不是数组元素,以这种方式打印对象:

{ “富”:“酒吧”, “废话”:[1、2、3] }

有谁知道如何做到这一点?谢谢!

【问题讨论】:

    标签: java json jackson deserialization


    【解决方案1】:

    如果您不想扩展 DefaultPrettyPrinter,您也可以在外部设置 indentArraysWith 属性:

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
    
    DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
    prettyPrinter.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);
    
    String json = objectMapper.writer(prettyPrinter).writeValueAsString(object);
    

    【讨论】:

    • Lf2SpacesIndenter 已被弃用(并且在较新的版本中消失了);使用 DefaultIndenter.SYSTEM_LINEFEED_INSTANCE
    • 使用 DefaultIndenter.SYSTEM_LINEFEED_INSTANCE 为我工作。这个答案提供了一个更简单的解决方案。
    【解决方案2】:

    感谢有用的提示,我能够将我的ObjectMapper 配置为所需的缩进如下:

    private static class PrettyPrinter extends DefaultPrettyPrinter {
        public static final PrettyPrinter instance = new PrettyPrinter();
    
        public PrettyPrinter() {
            _arrayIndenter = Lf2SpacesIndenter.instance;
        }
    }
    
    private static class Factory extends JsonFactory {
        @Override
        protected JsonGenerator _createGenerator(Writer out, IOContext ctxt) throws IOException {
            return super._createGenerator(out, ctxt).setPrettyPrinter(PrettyPrinter.instance);
        }
    }
    
    {
        ObjectMapper mapper = new ObjectMapper(new Factory());
        mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
    }
    

    【讨论】:

      【解决方案3】:

      您可以扩展 DefaultPrettyPrinter 并覆盖方法 beforeArrayValues(...)writeArrayValueSeparator(...) 以归档所需的行为。之后,您必须通过setPrettyPrinter(…) 将您的新实现添加到您的 JsonGenerator。

      【讨论】:

        【解决方案4】:

        映射器可以配置(jackson-2.6):

        ObjectMapper mapper = ...
        DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
        prettyPrinter.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);
        mapper.setDefaultPrettyPrinter(prettyPrinter);
        
        //use mapper 
        

        【讨论】:

          【解决方案5】:

          感谢 OP 提供的 answer 显示了一种从 writeValueAsString 获取单个数组元素每行格式的 JSON String 的方法。基于它,这里有一个解决方案,可以使用更少的代码将相同格式的 JSON 直接写入带有 writeValue 的文件:

          private static class PrettyPrinter extends DefaultPrettyPrinter {
              public static final PrettyPrinter instance = new PrettyPrinter();
          
              public PrettyPrinter() {
                  _arrayIndenter = Lf2SpacesIndenter.instance;
              }
          }
          
          {
              ObjectMapper mapper = new ObjectMapper();
              ObjectWriter writer = mapper.writer(PrettyPrinter.instance);
              writer.writeValue(destFile, objectToSerialize);
          }
          

          【讨论】:

            【解决方案6】:

            试用 JSON 生成器...

            API Reference
            good example

            【讨论】:

              猜你喜欢
              • 2015-02-28
              • 2012-02-08
              • 2012-07-27
              • 1970-01-01
              • 2013-10-25
              • 2021-06-22
              • 1970-01-01
              • 1970-01-01
              • 2017-06-27
              相关资源
              最近更新 更多