Я использую 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));