问题描述
{
"John": {
"company": "xxx","address": "San Francisco","contact": [
"phone1","phone2"
]
},"Alice": {
"company": "yyy","address": "Boston","contact": [
"phone3","phone4"
]
}
}
如果我使用GsonBuilder setPrettyPrinting,它将打印为:
{
"John": {"company": "xxx","contact": ["phone1","phone2"]},"Alice": {"company": "yyy","contact": ["phone3","phone4"]}
}
我要按以下方式打印它:
{
"John": {
"company": "xxx","phone2"]
},"phone4"]
}
}
或至少在一行中包含联系人列表
{{1}}
这可能吗?可以使用GsonBuilder模块完成此操作吗?
解决方法
答案是否定的。 GsonBuilder没有该功能。 但是您可以编写自定义Java代码来仅打印JSON的第一级 通过获取密钥并单独循环第一层。
,这可能吗?
排序。 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"]}
}
请注意,它不能为内联元素添加“漂亮空格”(即John
和Alice
的属性用,
分隔,而不是,
(后跟空格)。