gpt4 book ai didi

Java - 使用 Gson 序列化 Iterable>

转载 作者:行者123 更新时间:2023-11-30 05:43:06 27 4
gpt4 key购买 nike

我尝试使用 google GSON 库从 Map.Entry 类型序列化“Iterable” -我得到了一个空的输出。

这里是代码示例:

static private Iterable<Map.Entry<String, Integer>> getIterable(){
HashMap<String, Integer> map = new HashMap<>();
map.put("1", 1);
map.put("2", 2);

Iterable<Map.Entry<String, Integer>> iterable = map.entrySet();
return iterable;

}

public static void main(String[] args) {

Iterable<Map.Entry<String, Integer>> myIterable = getIterable();
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.enableComplexMapKeySerialization().create();
String a= gson.toJson(myIterable);
System.out.println(a);

}

这是输出:

[{},{}]

知道我做错了什么吗?

谢谢:)

java版本:1.8
gson版本:2.6.2

最佳答案

更简洁的方法可能是

final Iterable<Entry<String, Integer>> iterable = getIterable();
final Gson gson = new Gson();
final JsonArray jsonArray = new JsonArray();

for (final Entry<String, Integer> entry : iterable) {
final JsonElement jsonElement = gson.toJsonTree(entry);
jsonElement.getAsJsonObject().remove("hash");
jsonArray.add(jsonElement);
}

或者Stream版本,我喜欢

StreamSupport.stream(iterable.spliterator(), false)
.map(gson::toJsonTree)
.map(JsonElement::getAsJsonObject)
.peek(obj -> obj.remove("hash"))
.collect(of(
JsonArray::new,
(array, obj) -> array.add(obj),
(output, toMerge) -> {
output.addAll(toMerge);
return output;
}
));

输出:[{"key":"1","value":1},{"key":"2","value":2}]

<小时/>

TL;DR:您需要自定义 TypeAdapterFactory 自定义TypeAdapter .

请参阅 TypeAdapters 上的此方法

public static <TT> TypeAdapterFactory newFactory(
final TypeToken<TT> type, final TypeAdapter<TT> typeAdapter) {
return new TypeAdapterFactory() {
@SuppressWarnings("unchecked") // we use a runtime check to make sure the 'T's equal
@Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
return typeToken.equals(type) ? (TypeAdapter<T>) typeAdapter : null;
}
};
}

enter image description here

没有自定义TypeAdapterFactory

typeToken.equals(type)

返回false ,甚至定制TypeAdapter<Entry>未使用。

<小时/>

问题就在这里,在 ReflectiveTypeAdapterFactory#write

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

out.beginObject();
try {
for (BoundField boundField : boundFields.values()) {
if (boundField.writeField(value)) {
out.name(boundField.name);
boundField.write(out, value);
}
}
} catch (IllegalAccessException e) {
throw new AssertionError(e);
}
out.endObject();
}

以及ReflectiveTypeAdapterFactory#getBoundFields

private Map<String, BoundField> getBoundFields(Gson context, TypeToken<?> type, Class<?> raw) {
Map<String, BoundField> result = new LinkedHashMap<String, BoundField>();

if (raw.isInterface()) {
return result;
}

Gson 正在识别输入 Entry ( Class<?> raw 参数)为

interface Map.Entry<K, V> { ... }

因此

if (raw.isInterface())

产量true ,和一个空的 boundFields LinkedHashMap返回。
因此,这里

for (BoundField boundField : boundFields.values()) { ... }

循环未执行,并且没有提取和写入任何值

boundField.write(...)

关于Java - 使用 Gson 序列化 Iterable<Map.Entry<>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55324814/

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