JavaJSON序列化-最佳实践
我需要为一些对象实现JSON序列化,在与泛型集合集成时遇到了一个问题 所有可序列化类都实现此接口(JSONObject来自库): 基于java.util.list的我的集合的代码大致如下:JavaJSON序列化-最佳实践,java,json,design-patterns,Java,Json,Design Patterns,我需要为一些对象实现JSON序列化,在与泛型集合集成时遇到了一个问题 所有可序列化类都实现此接口(JSONObject来自库): 基于java.util.list的我的集合的代码大致如下: class AwesomeList<T extends JSONSerializable> implements JSONSerializable{ private LinkedList<T> items = new LinkedList<T>(); ...
class AwesomeList<T extends JSONSerializable> implements JSONSerializable{
private LinkedList<T> items = new LinkedList<T>();
...
...
public JSONObject dump() throws JSONException {
JSONObject result = new JSONObject();
JSONArray a = new JSONArray();
for(T i : items){
a.put(i.dump());
}
result.put("items", a);
return result;
}
public void load(JSONObject obj) throws JSONException{
//here is my problem
}
}
我应该如何修改此任务的方法?您是否与此库绑定?很受欢迎。我自己没有将它用于泛型,但他们的头版说Gson认为对泛型的支持非常重要。好吧,当将它写入文件时,您知道什么是类T,所以您可以将它存储在
dump
中。然后,当读回它时,您可以使用反射动态调用它
public JSONObject dump() throws JSONException {
JSONObject result = new JSONObject();
JSONArray a = new JSONArray();
for(T i : items){
a.put(i.dump());
// inside this i.dump(), store "class-name"
}
result.put("items", a);
return result;
}
public void load(JSONObject obj) throws JSONException {
JSONArray arrayItems = obj.getJSONArray("items");
for (int i = 0; i < arrayItems.length(); i++) {
JSONObject item = arrayItems.getJSONObject(i);
String className = item.getString("class-name");
try {
Class<?> clazzy = Class.forName(className);
T newItem = (T) clazzy.newInstance();
newItem.load(obj);
items.add(newItem);
} catch (InstantiationException e) {
// whatever
} catch (IllegalAccessException e) {
// whatever
} catch (ClassNotFoundException e) {
// whatever
}
}
publicJSONObject dump()抛出JSONException{
JSONObject结果=新建JSONObject();
JSONArray a=新的JSONArray();
对于(TI:项目){
a、 put(i.dump());
//在这个i.dump()中,存储“类名”
}
结果.付诸表决(“项目”,a);
返回结果;
}
公共无效加载(JSONObject obj)抛出JSONException{
JSONArray arrayItems=obj.getJSONArray(“项目”);
对于(int i=0;i 正如其他人所暗示的,你应该考虑倾销org。JSON的库。这些天已经过时了,试图解决它的问题是浪费时间。
但对于特定的问题,类型变量T并没有任何信息可以帮助您,因为它只不过是编译时的信息。
相反,您需要传递实际的类(作为'class cls'参数),然后可以使用'cls.newInstance()'创建一个实例。您是否尝试过json io()
此库允许您序列化/反序列化任何Java对象图,包括包含循环的对象图(例如,A->B,B->A)。它不要求您的类实现任何特定接口或从任何特定Java类继承
除了Java到JSON(以及JSON到Java)的序列化之外,您还可以使用它格式化(漂亮打印)JSON:
老实说,我看不出这在已知类型中是如何工作的。您是否将类名存储在JSON数据包中?不,每个对象都知道如何从JSONObject加载自己(实际上它只是关联数组)。我更新了帖子以展示我想要做的事情。gson可以很好地处理泛型。上次我检查gson不处理循环引用..虽然更新可以解决这一问题..我发现[link]是最好的。检查我的这个问题,了解如何在gson[link]中使用泛型进行json转换GSON的使用非常非常简单。如果您需要处理泛型、循环引用、接口、集合和定义了接口的映射(映射不是LinkedHashMap)等,请尝试使用json io:。
T newItem = new T();
newItem.load(obj);
public JSONObject dump() throws JSONException {
JSONObject result = new JSONObject();
JSONArray a = new JSONArray();
for(T i : items){
a.put(i.dump());
// inside this i.dump(), store "class-name"
}
result.put("items", a);
return result;
}
public void load(JSONObject obj) throws JSONException {
JSONArray arrayItems = obj.getJSONArray("items");
for (int i = 0; i < arrayItems.length(); i++) {
JSONObject item = arrayItems.getJSONObject(i);
String className = item.getString("class-name");
try {
Class<?> clazzy = Class.forName(className);
T newItem = (T) clazzy.newInstance();
newItem.load(obj);
items.add(newItem);
} catch (InstantiationException e) {
// whatever
} catch (IllegalAccessException e) {
// whatever
} catch (ClassNotFoundException e) {
// whatever
}
}
String niceFormattedJson = JsonWriter.formatJson(jsonString)