亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

gson 自定義特定的序列化的方式

gson 自定義特定的序列化的方式

明月笑刀無情 2019-03-01 10:43:14
有一個 Student 類,包含了 id 和 name 兩個屬性,使用 SpringMVC 和 gson 整合,默認 gson 將該實體會序列化為: { "id" : 1, "name" : "StuName" } 目前希望將 Student 序列化為: { "Type" : "Student", "Property": { "id" : 1, "name" : "StuName" } } 請問大家該如何做呢?(gson 版本為 2.8.0,使用 TypeAdapter 我一直得不到想要的效果。使用 Jackson 的時候,可以直接定義一個 JsonSerializer 并將其使用 @JsonSerialize(using = xxx.class) 注解來自定義序列化的格式,不知道在 gson 中有沒有提供的方式)
查看完整描述

2 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

用:JsonSerializer/JsonDeserializer

    public static class StudentJsonSerializer implements JsonSerializer<Student> {
        @Override
        public JsonElement serialize(Student src, Type typeOfSrc, JsonSerializationContext context) {
            final JsonObject propEle = new JsonObject();
            propEle.addProperty("id", src.getId());
            propEle.addProperty("name", src.getName());

            final JsonObject root = new JsonObject();
            root.addProperty("Type", "Student");
            root.add("Property", propEle);

            return root;
        }
    }
    
    public static class StudentJsonDeserializer implements JsonDeserializer<Student> {
        public Student deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            final JsonObject root = json.getAsJsonObject();
            JsonObject propEle = root.getAsJsonObject("Property");

            Student student = new Student();
            student.setId(propEle.get("id").getAsInt());
            student.setName(propEle.get("name").getAsString());
            return student;
        }
    }
    
    @Test
    public void test_1010000010436869() {
        Gson gson = new GsonBuilder().registerTypeAdapter(Student.class, new StudentJsonSerializer())
                .registerTypeAdapter(Student.class, new StudentJsonDeserializer()).create();
        Student student = new Student();
        student.setId(1);
        student.setName("StuName");
        String json = gson.toJson(student);
        System.out.println(json);

        Student student2 = gson.fromJson(json, Student.class);
        System.out.println(student2);
    }
查看完整回答
反對 回復 2019-03-01
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

通過繼承 GsonHttpMessageConverter 并覆寫 writeInternal 方法達到了想要的效果,但不知道有沒有更加優雅的方法。

public class MyGsonHttpMessageConverter extends GsonHttpMessageConverter {

    @Override
    protected void writeInternal(Object o, Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {

        if (o instanceof Student) {

            Student s = (Student) o;

            JsonObject stuObj = new JsonObject();
            stuObj.addProperty("id", s.getId());
            stuObj.addProperty("name", s.getName());

            JsonObject entity = new JsonObject();
            entity.addProperty("Type", "Student");
            entity.add("property", stuObj);

            try (OutputStreamWriter writer = new OutputStreamWriter(outputMessage.getBody(), DEFAULT_CHARSET)) {

                Gson gson = super.getGson();
                gson.toJson(entity, writer);

            } catch (JsonIOException ex) {
                throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
            }

        } else {
            super.writeInternal(o, type, outputMessage);
        }
    }

}
查看完整回答
反對 回復 2019-03-01
  • 2 回答
  • 0 關注
  • 1276 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號