ligi ligi - 9 months ago 40
Java Question

json formatting with moshi

Does anyone know a way to get moshi to produce a multi-line json with indentation ( for human consumption in the context of a config.json )
so from:

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


to something like this:

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


I know other json-writer implementations can do so - but I would like to stick to moshi here for consistency

Answer Source

If you can deal with serializing the Object yourself, this should do the trick:

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);
    }
}

This prints:

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

See prettyPrintObject() in this test file and the source code of BufferedSinkJsonWriter.

However, I haven't yet figured out whether and how it is possible to do this if you're using Moshi with Retrofit.