Gson serialize null for specific class or field

后端 未结 5 441
面向向阳花
面向向阳花 2021-01-01 11:00

I want to serialize nulls for a specific field or class.

In GSON, the option serializeNulls() applies to the whole JSON.

Example:



        
5条回答
  •  攒了一身酷
    2021-01-01 11:36

    Create subclass of com.google.gson.TypeAdapter and register it for required field using annotation com.google.gson.annotations.JsonAdapter. Or register it using GsonBuilder.registerTypeAdapter. In that adapter write (and read) should be implemented. For example:

    public class JsonTestNullableAdapter extends TypeAdapter {
    
        @Override
        public void write(JsonWriter out, Test value) throws IOException {
            out.beginObject();
            out.name("name");
            out.value(value.name);
            out.name("value");
            if (value.value == null) {
                out.setSerializeNulls(true);
                out.nullValue();
                out.setSerializeNulls(false);
            } else {
                out.value(value.value);
            }
            out.endObject();
        }
    
        @Override
        public Test read(JsonReader in) throws IOException {
            in.beginObject();
            Test result = new Test();
            in.nextName();
            if (in.peek() != NULL) {
                result.name = in.nextString();
            } else {
                in.nextNull();
            }
            in.nextName();
            if (in.peek() != NULL) {
                result.value = in.nextString();
            } else {
                in.nextNull();
            }
            in.endObject();
            return result;
        }
    
    }
    

    in MainClass add JsonAdapter annotation with the adapter to Test class field:

    public static class MClass {
        public String id;
        public String name;
        @JsonAdapter(JsonTestNullableAdapter.class)
        public Test test;
    }
    

    the output of System.out.println(new Gson.toJson(mainClass)) is:

    {
        "id": "101",
        "test": {
            "name": "testName",
            "value": null
        }
    }
    

提交回复
热议问题