gpt4 book ai didi

java - 如何使用 JsonElement 在 Gson 中执行自定义序列化?

转载 作者:行者123 更新时间:2023-11-30 05:45:19 26 4
gpt4 key购买 nike

我使用 gson 来序列化和反序列化 java 对象以及它的内置 JsonElement。如果我要序列化一个 java 对象,那么我可以注册一个类型适配器,它将被调用并允许我提供自定义序列化。

但是当我有一个 JsonElement 时,我似乎无法让它识别我想要适应的类型。假设我有这个:

JsonArray arr = new JsonArray();
arr.add(Math.PI);
arr.add(Math.E);
System.out.println(arr.toString());

这将打印出:

[3.141592653589793,2.718281828459045]

但是我如何将其限制为三位小数?我希望我可以添加一个类型适配器,但我无法注册任何内容,即适配器的方法永远不会被调用。在这种情况下,我是否应该注册 Double、Number、JsonPrimitive 或其他内容?我已经尝试了所有方法,但没有任何效果。

即使它确实有效,我认为我能做的最好的事情就是进行一些数学舍入,因为如果我尝试使用 String.format() 来“调整”数字,那么结果将是一个字符串而不是数字,我希望输出 json 保留为数字。

或者也许我完全错过了一些东西?这是我尝试过的一个示例:

Gson gson = (new GsonBuilder()).registerTypeAdapter(
JsonPrimitive.class,
new TypeAdapter<JsonPrimitive>() {
@Override
public JsonPrimitive read(JsonReader reader) throws IOException {
// never using deserialization, don't expect this to print
System.out.println("read adapter");
return null;
}

@Override
public void write(JsonWriter writer, JsonPrimitive primitive) throws IOException {
// this never gets called; output same as above
System.out.println("write adapter");
writer.nullValue();
}
}
).create();
System.out.println(gson.toJson(arr));

最佳答案

我们无法更改 Json* 类的内部适配器,因为 Gson 使用预定义的 com.google.gson.internal.bind.TypeAdapters.JSON_ELEMENT 。但幸运的是,我们可以提供 JsonWriter 实现。覆盖您需要的方法并向序列化过程提供实现。要舍入 double ,请使用 BigDecimal。自定义实现示例:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;
import java.io.StringWriter;
import java.math.BigDecimal;

public class GsonApp {

public static void main(String[] args) {
Gson gson = new GsonBuilder().create();
JsonArray array = new JsonArray();
array.add(Math.PI);
array.add(Math.E);

StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter) {
@Override
public JsonWriter value(Number value) throws IOException {
BigDecimal bigDecimal = BigDecimal.valueOf(value.doubleValue());
BigDecimal result = bigDecimal.setScale(3, BigDecimal.ROUND_UP);

return super.value(result.doubleValue());
}
};
jsonWriter.setIndent(" ");

gson.toJson(array, jsonWriter);
System.out.println(stringWriter.toString());
}
}

上面的代码打印:

[
3.142,
2.719
]

另请参阅:

关于java - 如何使用 JsonElement 在 Gson 中执行自定义序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54953752/

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