网站建设申请计划,跟网站开发有关的内容,专门做辅助的网站,wordpress 与现有ssogson json和类转换经过多年使用org.json库在Java中支持JSON数据交换格式后#xff0c;我已切换到Google Gson 。 org.json是一个较低层的库#xff0c;因此您必须创建JSONObject#xff0c;JSONArray#xff0c;JSONString等…并执行其他低层工作。 Gson简化了这项工作。 它… gson json和类转换 经过多年使用org.json库在Java中支持JSON数据交换格式后我已切换到Google Gson 。 org.json是一个较低层的库因此您必须创建JSONObjectJSONArrayJSONString等…并执行其他低层工作。 Gson简化了这项工作。 它提供了简单的toJson和fromJson方法可将任意Java对象转换为JSON反之亦然支持Java泛型允许对对象进行自定义表示生成紧凑且可读性强的JSON输出并具有许多其他优点。 我越来越喜欢它。 使用很简单。 假设我们有一个叫做Circle的类。 public class Circle {private int radius 10;private String backgroundColor #FF0000;private String borderColor #000000;private double scaleFactor 0.5;...// getter / setter
} 序列化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 MapString, AbstractElement elements new LinkedHashMapString, AbstractElement();...
} 问题是在反序列化过程中未公开具体类。 在Whiteboard的JSON表示中未知。 如何从JSON表示形式实例化正确的Java类并将其放入Map StringAbstractElement元素中 我在文档中找不到任何解决该问题的方法。 显然我们需要在有关具体类的JSON表示中存储元信息。 这是肯定的。 Gson允许您注册自己的自定义序列化器和反序列化器。 这是Gson的强大功能。 有时默认表示不是您想要的。 例如在处理第三方库类时通常就是这种情况。 有足够的示例说明如何编写自定义序列化器/反序列化器。 我将创建一个实现两个接口JsonSerializerJsonDeserializer的适配器类并将其注册为我的抽象类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 JsonSerializerAbstractElement, JsonDeserializerAbstractElement {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 JsonParseException JsonDeserializationContext中的from会在指定对象上调用默认反序列化并完成作业。 参考 带有GSON的JSON和来自JCG合作伙伴 Oleg Varaksin的抽象类 在软件开发博客上。 翻译自: https://www.javacodegeeks.com/2012/04/json-with-gson-and-abstract-classes.htmlgson json和类转换