gpt4 book ai didi

java - GSON 序列化和反序列化列表委托(delegate)者

转载 作者:太空宇宙 更新时间:2023-11-04 14:35:28 25 4
gpt4 key购买 nike

我有一个实现 List<T> 的类并包装 ArrayList<T>它委托(delegate)给哪个。类似这样的事情:

class ListWrapper<T> implements List<T> {   
private String id;
private List<T> list = new ArrayList<T>();
private transient ListListener listener;

// all of List interface methods are delegated here e.g.
public void add(T t) {
list.add(t);
listener.onItemAdded(id);
}
...
}

GSON默认行为是将这个东西视为 List因此它不会调用字段级反射。

我想得到一个像这样的json:

{
id="1234",
list=[....]
}

你知道如何优雅地做到这一点吗?

最佳答案

在这种情况下,您可以使用自定义 TypeAdapter。

示例:

class ListWrapper<T> extends ArrayList<T>
{
private static final long serialVersionUID = 1L;

String id = "asd";
List<T> list = new ArrayList<T>();
transient T listener = null;
}

创建自定义 TypeAdapter

   class CustomTypeAdapter<T> extends TypeAdapter<ListWrapper<T>>
{

@Override
public void write(JsonWriter writer, ListWrapper<T> value) throws IOException
{
if (value == null)
{
writer.nullValue();
return;
}

writer.beginObject();

// Add id field
writer.name("id").value(value.id);

// Add list field
StringBuilder builder = new StringBuilder("");
builder.append("list : [ ");
for (T t : value.list)
{
builder.append("T : " + t.toString() + ",");
}
String txt = builder.substring(0, builder.length() - 1) + "]";
writer.name("list").value(StringUtils.join(value.list, ";"));

// Add other fields
// TODO

writer.endObject();
}
@Override
public ListWrapper<T> read(JsonReader in) throws IOException
{
// Implement your deserialization logic here
return null;
}
}

使用示例:

 public static void main(String[] args)
{

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(ListWrapper.class, new CustomTypeAdapter<String>());
Gson gson = builder.create();
ListWrapper<String> lw = new ListWrapper<String>();
lw.list.add("as");
lw.list.add("is");
System.out.println(gson.toJson(lw));
}

示例输出 JSON:

 {"id":"asd","list":"as;is"}

关于java - GSON 序列化和反序列化列表委托(delegate)者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25640439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com