9

有谁知道一种让 moshi 生成带有缩进的多行 json 的方法(供人类在 config.json 的上下文中使用),因此来自:

{"max_additional_random_time_between_checks":180,"min_time_between_checks":60}

像这样:

{
   "max_additional_random_time_between_checks":180,
   "min_time_between_checks":60
}

我知道其他 json-writer 实现可以这样做 - 但我想在这里坚持使用 moshi 以保持一致性

4

2 回答 2

8

现在您可以使用.indent(" ")适配器上的方法进行格式化。

 final Moshi moshi = new Moshi.Builder().build();
 String json = moshi.adapter(Dude.class).indent("  ").toJson(new Dude())
于 2017-03-11T19:21:56.310 回答
7

如果您可以自己处理序列化对象,那么这应该可以解决问题:

import com.squareup.moshi.JsonWriter;
import com.squareup.moshi.Moshi;

import java.io.IOException;

import okio.Buffer;

public class MoshiPrettyPrintingTest {

    private static class Dude {
        public final String firstName = "Jeff";
        public final String lastName = "Lebowski";
    }

    public static void main(String[] args) throws IOException {

        final Moshi moshi = new Moshi.Builder().build();

        final Buffer buffer = new Buffer();
        final JsonWriter jsonWriter = JsonWriter.of(buffer);

        // This is the important part:
        // - by default this is `null`, resulting in no pretty printing
        // - setting it to some value, will indent each level with this String
        // NOTE: You should probably only use whitespace here...
        jsonWriter.setIndent("    ");

        moshi.adapter(Dude.class).toJson(jsonWriter, new Dude());

        final String json = buffer.readUtf8();

        System.out.println(json);
    }
}

这打印:

{
    "firstName": "Jeff",
    "lastName": "Lebowski"
} 

请参阅此测试文件prettyPrintObject().BufferedSinkJsonWriter

但是,如果您将 Moshi 与 Retrofit 一起使用,我还没有弄清楚是否以及如何做到这一点。

于 2016-01-27T11:27:29.497 回答