Jackson の PrettyPrinter

Jackson による整形したJSONのテキスト出力は、これという1つが決めることができない。
例)

{"A":"Blue","B":[10,12,14],"C":[{"length":[100,120,140]},{"length":[100,120,140]}]}

DefaultPrettyPrinter の indentObjectsWith と indentArraysWith を指定する方法

public static <T> String prettyString(T t) {
    DefaultPrettyPrinter.Indenter indenter = new DefaultIndenter("  ", DefaultIndenter.SYS_LF);
    DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
    printer.indentObjectsWith(indenter);
    printer.indentArraysWith(indenter);
    try{
        return new ObjectMapper().writer(printer).writeValueAsString(t);
    }catch(JsonProcessingException e){
        throw new RuntimeException(e.getMessage(), e);
    }
}

この結果は、

{
  "A" : "Blue",
  "B" : [
    10,
    12,
    14
  ],
  "C" : [
    {
      "length" : [
        100,
        120,
        140
      ]
    },
    {
      "length" : [
        100,
        120,
        140
      ]
    }
  ]
}

長い!配列は、1行にしたい。。。
indentArraysWith を実行しないようにする。

public static <T> String prettyString(T t) {
    DefaultPrettyPrinter.Indenter indenter = new DefaultIndenter("  ", DefaultIndenter.SYS_LF);
    DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
    printer.indentObjectsWith(indenter);
    try{
        return new ObjectMapper().writer(printer).writeValueAsString(t);
    }catch(JsonProcessingException e){
        throw new RuntimeException(e.getMessage(), e);
    }
}

すると、単純な配列は1行だが、ネストした配列は、、、

{
  "A" : "Blue",
  "B" : [ 10, 12, 14 ],
  "C" : [ {
    "length" : [ 100, 120, 140 ]
  }, {
    "length" : [ 100, 120, 140 ]
  } ]
}

でもこれは、、
ObjectMapper の writerWithDefaultPrettyPrinter() を使えば同じこと。

public static <T> String prettyString(T t) {
    try{
        return new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(t);
    }catch(JsonProcessingException e){
        throw new RuntimeException(e.getMessage(), e);
    }
}