javascript
带有GSON和抽象类的JSON
序列化(Java對象–> JSON)可以如下進行:
Circle circle = new Circle(); Gson gson = new Gson(); String json = gson.toJson(circle); ==> json is {"radius": 10,"backgroundColor": "#FF0000","borderColor": "#000000","scaleFactor": 0.5,... }反序列化(JSON –> Java對象)只是一行代碼:
Circle circle2 = gson.fromJson(json, Circle.class); ==> circle2 is the same as the circle above一切都像魅力。 我只遇到抽象類一個問題。 假設,我們有一個抽象類AbstractElement和許多其他類來擴展這一類
public abstract class AbstractElement {private String uuid;// getter / setter }public class Circle extends AbstractElement {... }public class Rectangle extends AbstractElement {... }public class Ellipse extends AbstractElement {... }現在假定,我們將所有具體類存儲在使用AbstractElement參數化的列表或映射中
public class Whiteboard {private Map<String, AbstractElement> elements = new LinkedHashMap<String, AbstractElement>();... }問題是在反序列化期間未公開具體類。 在Whiteboard的JSON表示中未知。 如何從JSON表示形式實例化正確的Java類并將其放入Map <String,AbstractElement>元素中? 我在文檔中找不到解決該問題的方法。 顯然,我們需要在有關具體類的JSON表示中存儲元信息。 這是肯定的。 Gson允許您注冊自己的自定義序列化器和反序列化器。 這是Gson的強大功能。 有時默認表示不是您想要的。 例如在處理第三方庫類時,通常就是這種情況。 有足夠的示例說明如何編寫自定義序列化器/反序列化器。 我將創建一個實現兩個接口JsonSerializer,JsonDeserializer的適配器類,并將其注冊為我的抽象類AbstractElement。
GsonBuilder gsonBilder = new GsonBuilder(); gsonBilder.registerTypeAdapter(AbstractElement.class, new AbstractElementAdapter()); Gson gson = gsonBilder.create();這是AbstractElementAdapter:
package com.googlecode.whiteboard.json;import com.google.gson.*; import com.googlecode.whiteboard.model.base.AbstractElement; import java.lang.reflect.Type;public class AbstractElementAdapter implements JsonSerializer<AbstractElement>, JsonDeserializer<AbstractElement> {@Overridepublic JsonElement serialize(AbstractElement src, Type typeOfSrc, JsonSerializationContext context) {JsonObject result = new JsonObject();result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));result.add("properties", context.serialize(src, src.getClass()));return result;}@Overridepublic AbstractElement deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)throws JsonParseException {JsonObject jsonObject = json.getAsJsonObject();String type = jsonObject.get("type").getAsString();JsonElement element = jsonObject.get("properties");try {return context.deserialize(element, Class.forName("com.googlecode.whiteboard.model." + type));} catch (ClassNotFoundException cnfe) {throw new JsonParseException("Unknown element type: " + type, cnfe);}} }我添加了兩個JSON屬性-一個是“類型”,另一個是“屬性”。 第一個屬性保存AbstractElement的具體實現類(簡單名稱),第二個屬性保存序列化對象本身。 JSON看起來像
{"type": "Circle","properties": {"radius": 10,"backgroundColor": "#FF0000","borderColor": "#000000","scaleFactor": 0.5,...} }反序列化期間,我們受益于“類型”屬性。 現在可以通過Class.forName(“ com.googlecode.whiteboard.model。” + type)實例化具體類,其中“ com.googlecode.whiteboard.model”。 + type是完全限定的類名。 以下通話
public <T> T deserialize(JsonElement json, Type typeOfT) throws JsonParseExceptionJsonDeserializationContext中的from會在指定對象上調用默認的反序列化并完成作業。
參考: 帶有GSON的JSON和來自JCG合作伙伴 Oleg Varaksin的抽象類 , 位于軟件開發博客上。
翻譯自: https://www.javacodegeeks.com/2012/04/json-with-gson-and-abstract-classes.html
總結
以上是生活随笔為你收集整理的带有GSON和抽象类的JSON的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 烤虾干怎么吃 烤虾干怎样做好吃
- 下一篇: 茄子为什么叫做茂名磨刀石 茄子叫茂名磨刀