- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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/
JsonElement#getAsString()有什么区别对比 JsonElement#toString() ? 在某些情况下,应该使用一种方法吗? 最佳答案 假设您指的是 JsonElement
public String toJson() { GsonBuilder builder = new GsonBuilder(); Gson gson = builder.create
我正在使用 Unirest 库通过以下代码行调用公开可用的 REST 端点: public void callRest() { String url = "https://upstream.c
(在我看来,这个问题应该已经在某个地方被问过,但我只是找不到它,所以如果重复的话请提前原谅) 我正在使用 Hibernate 和 Gson。比如说,我有一个像这样的对象 @Entity class F
是否可以确定是否是 GSON JsonElement实例是整数还是浮点数? 我能够确定它是否是一个数字: JsonElement value = ... boolean isNumber = valu
好吧,我想知道这可能是非常简单和愚蠢的,但在与这种情况斗争了一段时间之后,我不知道发生了什么。 我正在使用 Gson 来处理一些 JSON 元素。在我的代码中的某处,我将 JsonObject 的 J
我在将 JsonElement 转换为字符串时遇到了一些问题。我正在使用 getAsString() 方法调用,但我不断收到不受支持的操作异常。我检查了我正在调用的 get 的输出,它似乎是正确的。
我正在与 JsonElements 合作及其 addProperty 方法。 JsonElement 有 4 个重载的 addProperty 方法,我想将它们压缩为一个,以便更轻松地添加属性。这就是
我需要从给定的 JSON 文件中读取 JsonElements。我正在使用 org.json.simple jar。 这是我的 json 示例: [{ "Submission ID": "99383
我有一个大型且复杂的 JSON 对象,如下所示: { "FDN": [{ "OT": 1, "CL": [{ "K": [{
我有这样的 JsonElement: { "76800769": { "prosjekLat": 45.784661646364, "prosjekLong":
我有一个方法可以解析两个 JsonElement 之间的差异,然后返回一个 JsonElement,它代表一个只包含两个元素之间差异的对象。 然后我尝试通过 API PUT 请求发送返回的 JsonE
我正在使用 JSONSerializer 从 SQL 数据库访问数据。我设法毫无问题地读取数据,并设法获取每个条目并为每个条目创建一个临时对象。我将每个对象添加到一个数组中。但是,当我在这个方法之外检
我想用这个方法: json.add("myText", getList(id)); 函数 getList(id) 返回一个数组列表,但是方法 json.add 想要一个 JsonElement。 那么
在很多JSON解析器中,json的元素都是以object(reference)类型呈现的。 但是在 C# 中,System.Text.Json JsonElement 是 struct 类型。为什么J
我有一个 JsonElement: JsonElement testCaseParametersJson = batchItem.getTestCase().getToolParameters().g
在很多JSON解析器中,json的元素都是以object(reference)类型呈现的。 但是在 C# 中,System.Text.Json JsonElement 是 struct 类型。为什么J
我正在用 JUnit 编写单元测试,我想知道是否有办法对其执行 assertEquals 比较。 我想比较两个 JsonElement 类,但我想忽略 JSON 中数组属性中的一个字段。 我的 JSO
我使用 gson 来序列化和反序列化 java 对象以及它的内置 JsonElement。如果我要序列化一个 java 对象,那么我可以注册一个类型适配器,它将被调用并允许我提供自定义序列化。 但是当
在我的 Kotlin 项目中,我必须使用 com.google.gson.JsonObject。 val jsonRedir = JsonObject() someCustomMethod(jsonR
我是一名优秀的程序员,十分优秀!