第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

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

2 回答

?
陪伴而非守候

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊

用: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);
    }
查看完整回答
反對(duì) 回復(fù) 2019-03-01
?
繁星點(diǎn)點(diǎn)滴滴

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊

通過(guò)繼承 GsonHttpMessageConverter 并覆寫 writeInternal 方法達(dá)到了想要的效果,但不知道有沒(méi)有更加優(yōu)雅的方法。

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

}
查看完整回答
反對(duì) 回復(fù) 2019-03-01
  • 2 回答
  • 0 關(guān)注
  • 1298 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)