json 用 moshi 格式化
json formatting with moshi
有谁知道让 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
如果您可以自己处理对象的序列化,这应该可以解决问题:
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"
}
参见 this test file and the source code of BufferedSinkJsonWriter
中的 prettyPrintObject()
。
但是,如果您将 Moshi 与 Retrofit 结合使用,我还没有弄清楚是否可以以及如何执行此操作。
现在您可以在适配器上使用 .indent(" ")
方法进行格式化。
final Moshi moshi = new Moshi.Builder().build();
String json = moshi.adapter(Dude.class).indent(" ").toJson(new Dude())
有谁知道让 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
如果您可以自己处理对象的序列化,这应该可以解决问题:
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"
}
参见 this test file and the source code of BufferedSinkJsonWriter
中的 prettyPrintObject()
。
但是,如果您将 Moshi 与 Retrofit 结合使用,我还没有弄清楚是否可以以及如何执行此操作。
现在您可以在适配器上使用 .indent(" ")
方法进行格式化。
final Moshi moshi = new Moshi.Builder().build();
String json = moshi.adapter(Dude.class).indent(" ").toJson(new Dude())