【问题标题】:Prettyprint json in java until only the first nestjava中的Prettyprint json直到只有第一个嵌套
【发布时间】:2021-01-09 05:17:07
【问题描述】:

我有一个 json 格式:

{"John": {"company": "xxx", "address": "San Francisco", "contact": ["phone1", "phone2"]}, "Alice": {"company": "yyy", "address": "Boston", "contact": ["phone3", "phone4"]}}

如果我使用 GsonBuilder setPrettyPrinting,它会将其打印为:

{
  "John": {
    "company": "xxx",
    "address": "San Francisco",
    "contact": [
      "phone1",
      "phone2"
    ]
  },
  "Alice": {
    "company": "yyy",
    "address": "Boston",
    "contact": [
      "phone3",
      "phone4"
    ]
  }
}

我想打印如下:

{
  "John": {"company": "xxx", "address": "San Francisco", "contact": ["phone1", "phone2"]}, 
  "Alice": {"company": "yyy", "address": "Boston", "contact": ["phone3", "phone4"]}
}

或者至少在一行中有联系人列表

{
  "John": {
    "company": "xxx",
    "address": "San Francisco",
    "contact": ["phone1", "phone2"]
  },
  "Alice": {
    "company": "yyy",
    "address": "Boston",
    "contact": ["phone3", "phone4"]
  }
}

这可能吗?这可以使用 GsonBuilder 模块完成吗?

【问题讨论】:

    标签: java json gson pretty-print


    【解决方案1】:

    答案是否定的。 GsonBuilder 没有那个功能。 但是您可以编写自定义 java 代码来漂亮地打印 JSON 的第一级 通过获取密钥并单独循环第一级。

    【讨论】:

      【解决方案2】:

      这可能吗?

      有点。 Gson 为整个文档提供缩进,配置缩进只会影响 JSON 元素是否以配置的缩进级别放在新行上。

      这可以使用 GsonBuilder 模块完成吗?

      没有。 GsonBuilder 在它的 JavaDoc 中很清楚,并且提供了很少的可配置性:使用它,您只能启用或禁用缩进,当然它本身不能处理复杂的情况。

      但是,您可以扩展 JsonWriter 来处理自己的嵌套并根据您当前的嵌套级别切换缩进。

      public final class PrettyJsonWriter
              extends JsonWriter {
      
          private int level;
      
          public PrettyJsonWriter(final Writer out) {
              super(out);
          }
      
          @Override
          public JsonWriter beginArray()
                  throws IOException {
              final JsonWriter jsonWriter = super.beginArray();
              level++;
              adjustIndent();
              return jsonWriter;
          }
      
          @Override
          public JsonWriter endArray()
                  throws IOException {
              final JsonWriter jsonWriter = super.endArray();
              level--;
              adjustIndent();
              return jsonWriter;
          }
      
          @Override
          public JsonWriter beginObject()
                  throws IOException {
              final JsonWriter jsonWriter = super.beginObject();
              level++;
              adjustIndent();
              return jsonWriter;
          }
      
          @Override
          public JsonWriter endObject()
                  throws IOException {
              final JsonWriter jsonWriter = super.endObject();
              level--;
              adjustIndent();
              return jsonWriter;
          }
      
          // handle whatever rules you want
          private void adjustIndent() {
              final String indent;
              switch ( level ) {
              case 1:
                  indent = "\t";
                  break;
              default:
                  indent = StringUtils.EMPTY;
                  break;
              }
              setIndent(indent);
          }
      
      }
      

      用法很琐碎:

      final JsonWriter prettyJsonWriter = new PrettyJsonWriter(...);
      ...
      gson.toJson(jsonElement, prettyJsonWriter);
      

      您的文档会这样打印:

      {
          "John": {"company":"xxx","address":"San Francisco","contact":["phone1","phone2"]},
          "Alice": {"company":"yyy","address":"Boston","contact":["phone3","phone4"]}
      }
      

      请注意,它不能为内联元素添加“漂亮的空格”(即,JohnAlice 的属性用, 分隔,而不是, (尾随空格))。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-27
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-08
        • 1970-01-01
        相关资源
        最近更新 更多